포인터란
선언문과 함께 쓰인 포인터는 자료형에 불과하다.
하지만 선언문 없이 홀로 쓰인 포인터는 오른쪽 변수에 담긴 주소값에 담긴 변수로 가라는 뜻이다.
char z = 1;
char *a = &z;
char **b = &a;
char ***c = &b;
*a = z
*b = a = &z;
*c = b = &a;
***c =z ;
여기서 = 은 대입의 의미가 아니라, 무엇이 저장되었다는 의미로 쓰인다.
변수는 값을 담고, 캐릭터 포인터는 변수값의 주소를 담는다.
캐릭터 더블포인터는 포인터값의 주소를 담고, 캐릭터 트리플포인터는 더블포인터값의 주소를 담는다.
a에는 z의 주소가 저장되어 있으므로 *a는 z의 변수값이 담겨있다.
b에는 a의 주소가 저장되어 있으므로 *b는 a의 변수값이 담겨있다. 다시말해 z의 주소값이 담겨있다.
c에는 b의 주소가 저장되어 있으므로 *c엔 b의 변수값이 담겨있다. 다시말해 a의 주소값이 담겨있다.
트리플포인터로 해당 목적지를 가고싶다면 저런 구조로 담겨있으면 된다.
char a = 1;
char *b = &a;
*b = 2;
b = 2;
b = a;
b = &a;
a 라는 변수에 1을 저장했다.
b 라는 변수에 a 라는 변수의 주소값을 저장했다.
주소에 접근해 내용을 2로 바꾼다. 즉 a 변수의 값은 2로 바뀌었다.
b 라는 변수에 저장된 주소값을 2로 바꾼다. 즉 0x1243asdf 가 저장된 b의 값을 2로 바꾼다는 소리다.
b 변수에 저장된 주소값을 1로 바꾼다.
b 변수에 저장된 주소값을 동일한 주소값으로 바꾼다. 따라서 변화가 없다.
void set_new_string_ptr1(char *p) {
char *n = (char *)malloc(10);
p = n;
}
void set_new_string_ptr2(char **p) {
char * n = (char *)malloc(10);
if (p && *p) free(*p);
**p = n;
}
void main() {
char *b = (char *)malloc(5);
set_new_string_ptr(&b);
}
우선 메인함수의 b에는 새로이 할당한 stack부분에 5칸의 메모리의 주소가 담겼다.
그 값을 바꾸고싶다면 캐릭터포인터 b를 보내면 1번 함수가 받게 되, 그 캐릭터포인터의 포인터를 보내면 2번 함수가 받게 된다.
1번함수의 문제점은 p를 지역변수로 선언해, 실제 값을 바꿔주지 못한다는 점이다.
2번함수는 이중포인터로 해당 값이 들어있는 부분을 바꿔줄 수 있다는 점이 차이점이다.
&, * 차이
&는 메모리가 저장된 주소를 불러온다.
*는 주소에 저장된 값을 가져온다.
이때 단순히 '주소' 만을 가져온다면 어느 단위로 얼마나 읽어야 할지 감을 잡을 수 없기 때문에
* 에는 항상 데이터형을 붙여줘야 한다. ex) (char *)&cmd
C 프로그래밍 언어에서 '&'와 '*'는 모두 다른 변수의 메모리 주소를 저장하는 변수인 포인터와 함께 작동하는 데 사용됩니다. 그러나 그것들은 다른 의미와 사용법을 가지고 있습니다.
'&' 기호는 주소 연산자이며 변수의 메모리 주소를 가져오는 데 사용됩니다. 예를 들어 'x'가 변수인 경우 '&x'는 'x'의 메모리 주소를 제공합니다. '&' 기호는 값 대신 변수의 메모리 주소를 전달하기 위해 함수 인수에도 사용됩니다.
'*' 기호는 역참조 연산자이며 메모리 주소에 저장된 값에 액세스하는 데 사용됩니다. 예를 들어 'p'가 변수에 대한 포인터인 경우 'p'는 'p'가 가리키는 메모리 주소에 저장된 값을 제공합니다. '' 기호는 포인터 변수를 생성하기 위해 변수 선언에도 사용됩니다.
int x = 10; // Declare a variable x with value 10
int *p = &x; // Declare a pointer variable p and assign the memory address of x to it using '&'
int y = *p; // Declare a variable y and assign the value stored at the memory address pointed to by p using '*'
printf("Value of x: %d\n", x); // Output: Value of x: 10
printf("Memory address of x: %p\n", &x); // Output: Memory address of x: 0x7ffeefbff518
printf("Value of p: %p\n", p); // Output: Value of p: 0x7ffeefbff518
printf("Value of y: %d\n", y); // Output: Value of y: 10
위의 예에서 '&'는 'x'의 메모리 주소를 가져와서 'p'에 할당하는 데 사용되고 '*'는 'p'가 가리키는 메모리 주소에 저장된 값을 가져와서 할당하는 데 사용됩니다. 'y'에게.
'개발 > C' 카테고리의 다른 글
[C] syscall이란 (0) | 2023.01.13 |
---|---|
[C] pthread_create, pthread_join, pthread_exit, fork (0) | 2023.01.13 |
[C] 웹소켓프로그래밍 함수 정리 (socket.io) (0) | 2023.01.05 |
[C 소켓통신 #3] HTTP에 메시지를 보내고 받기 (0) | 2022.12.30 |
[C] 문자열 포인터 (0) | 2022.12.29 |