슬슬 점점 어렵고 헷갈리기 시작하는 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);
    }