슬슬 점점 어렵고 헷갈리기 시작하는 C 공부 분투기 …
원래 알던거때문에 엄청헷갈림.
이게뭔데 & 이게 왜 안돼? 의 향연이 펼쳐지고 있습니다
포인터 : 메모리 공간에 주소값을 저장하는 데이터 타입
#include <stdio.h>
// 4byte의 공간 할당
int x;
// 해당 변수의 주소는 앞에 '&' 붙이면 된다
// *를 붙인 것이 포인터 데이터 타입인 셈
int* pointerX = &x
// 이렇게 하면 pointerX는 x의 주소값을 품고 있는 셈인거다
// x변수의 주소값을 가지고 있는 pointerX의 주소값을 저장
int** pPointerX = &pointerX
변수라는 건 일종의 메모리 공간을 쓰겠다고 선언하는거니까 자신의 위치값을 각자 가지고 있다네요
할당되는 메모리 공간은 1byte+1byte+1byte+1byte 이런 식으로 죽 늘어져 있으니까 선두번지 주소값만 불러오면 찾을 수 있음
포인터 연산자
*x
*&pointerX = pointerX // 이렇게 하면 변수의 값이 출력됨
*pointerX = *&x = x
**pPointerX = **&pointerX = *PointerX = *&x = x
아마도 내가 이해한 바로는 주소값을 덜렁 던져주면 여기 안에 있는 값을 좀 받고싶은데… 하는 것 같다
대충 … *이랑 &이랑 만나면 뿌요뿌요처럼 터진다고 이해하고 있다 일단은…
이 주소값에 있는 변수를 내놔라 하고 명령하는 모양인데
낯선 어쩌구라 뇌력을 좀 써야하는 점이 힘들다 …
알파벳 순서를 외우라고 말하면 속으로 알파벳송을 불러야 하는 것처럼
손으로 일일히 해봐야 다시 이해가 된다는 점이 날 힘들게 함
배열
// 100개넣을수있는거 만들어라
int arr[100];
// 배열 7번에 이거 넣어라
int arr[7] = 150;
// 배열 초기값 설정
int arr[] = {10, 10, 30, 54, 12, 48, 35, 55}
이건 먼저 선언해야한다는 것 빼곤 별로 헷갈리는게 없다
+ 번외
// 배열 요소의 갯수 = 배열 전체 바이트 수 / 각 요소의 바이트 수
int lenght = sizeof(arrValue) / sizeof(int);
함수
// returnType 함수명(매개변수){ 명령어; }
void PrintHamster(int x){
for (int i = 0; i < x; i++){
printf("Hamster");
}
}
void PSwapValue(int* pa, int* pb) {
int temp = 0;
temp = *pa;
*pa = *pb;
*pb = temp;
}
int* pSetScore(int value) {
int score = 0;
score += value;
return &score;
}
함수 리턴타입을 설정해줘야 하는 것과 매개변수에도 데이터 타입을 써야 하는 게 신기하다.
그치만 리턴타입으로 포인터를 받는 걸 보고 마음이 차가워짐
이해하기가 킹받을뿐이지 그냥 return으로 주소값이 나간다는 거니까 그정돈 이해할 수 있다.
리턴값을 내보내지 않으면 자기들끼리 하하핫 하고 놀다가 산화해버린다.
근데 주소값 바꾸는건 걍 변경됨(왜?)
+
void pAdd(int a, int b, int* pret) {
*pret = a + b;
}
int ret = 0;
int a = 100;
int b = 200;
pAdd(a, b, &ret);
printf("%d + %d = %d\n", a, b, ret); // a + b = 300
// 인자값으로 주소값을 전달한다는 의미는
// 호출된 함수에서 전달받은 주소값의 메모리공간에 접근하겠다는 의미
변수
int global; // 전역변수
void Hamster(int data){
int hams = data; // 지역변수, 자동변수
static int hamster; // 지역변수, 정적변수
return &hams;
}
int main(){
int* hamsterAdd = Hamster(100);
printf("hams= %d, *hams = %d\n", hamsterAdd, *hamsterAdd);
printf("hams= %d, *hams = %d\n", hamsterAdd, *hamsterAdd);
printf("hams= %d, *hams = %d\n", hamsterAdd, *hamsterAdd);
}
사실 이거 무슨말인지 알겠는데 모르겠음
static을 앞에 써 넣으면 데이터가 남아있다는데 뭔가 상식적으로 말이 안되는 일 같다.
데이터가 남아있어서 계속 같은 값을 내보낸다고 하던..
그리고 함수를 변수에 넣을 수 없다는 것도 신기했다.
그냥 냅다 변수를 써서 호출이 됐는데 이상한 값이 나온게 아니고 그냥 호출이 안돼서 논리오류로 똥값이 나온거였음
스테틱한걸로 호출하면 그냥 원래 있던 값이 나오는거고 … 헐~
구조체
// 선언
struct tagHamster{
char name[30];
int age;
int birthday;
};
// typedef : tagHamster를 그냥 Hamster 라는 이름으로 쓰게 해주세요
typedef struct tagHamster Hamster;
// 호출
Hamster stArr[5] // 구조체 배열
Hamster.age = 30;
Hamster.birthday = 19930324
char buff[20]
Hamster stArr[5]
for (int i = 0; i < length; i++) {
// 형식지정문자열로 문자열을 생성해서 buff 문자배열에 저장
// 출력값을 버퍼에 저장한다(monster_i를 buff에 저장)
sprintf(buff, "monster_%d", i);
// stArr의 i번째 배열 이름에 buff를 넣으라고 함
strcpy(stArr[i].name, buff);
}