[C] 포인터란, & * 차이

2023. 1. 10. 18:36· 개발/C
목차
  1. 포인터란
  2. &, * 차이

이런느낌?

포인터란

선언문과 함께 쓰인 포인터는 자료형에 불과하다. 

하지만 선언문 없이 홀로 쓰인 포인터는 오른쪽 변수에 담긴 주소값에 담긴 변수로 가라는 뜻이다. 

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
  1. 포인터란
  2. &, * 차이
'개발/C' 카테고리의 다른 글
  • [C] syscall이란
  • [C] pthread_create, pthread_join, pthread_exit, fork
  • [C] 웹소켓프로그래밍 함수 정리 (socket.io)
  • [C 소켓통신 #3] HTTP에 메시지를 보내고 받기
yeonlee
yeonlee
yeonlee
이연
yeonlee
전체
오늘
어제
  • 분류 전체보기 (85)
    • 개발 (6)
      • Android Studio (15)
      • Java (15)
      • C (17)
      • HTML,PHP,JS (0)
    • 프로젝트 (1)
    • 일상 (2)
    • CS (27)
      • DB (9)
    • 정보보안기사 (0)
      • 시스템보안 (0)
      • 네트워크보안 (0)
      • 어플리케이션보안 (0)
      • 정보보안일반 (0)
      • 정보보안관리 및 법규 (0)
    • 코딩테스트 (0)
    • 잡동사니 (0)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • http://blog.skby.net/cpu-%EB%B9%84%EC%84%A0%EC%A0%90-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81-%EA%B8%B0%EB%B2%95/
  • https://hazel-developer.tistory.com/145
  • ㅇㄹ
  • 자기계발 대학생 명상캠프
  • https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages
  • https://velog.io/@tktnskan/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%93%B0%EB%A0%88%EB%93%9C

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
yeonlee
[C] 포인터란, & * 차이
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.