일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 낙동강 종주
- 구조체
- workbench
- 구포에서 삼량진
- android facebook
- volley
- android loadImage
- 로드바이크
- 안드로이드 이미지 로드
- ImageLoad
- android imageView zoom
- 부산에서 창원 자전거
- C언어
- elk stack
- mysql
- spring boot
- 삼량진 자전거
- spring
- image zoom
- 자바
- httpclient post
- android ImageLoad
- 삼량진
- NetworkImageView
- 부산에서 창원
- 자전거
- 구포에서 자전거
- laravel
- 창원에서 부산
- c언어 구조체
- Today
- Total
은근한
C언어 7. 포인터(이중포인터,포인터 배열) 본문
포인터란?..
포인터는 다른변수의 주소를 저장하는 변수 즉 주소를 저장하게 되어진 변수를 가리킨다고 해야되나?..
포인터변수는 변수의 값을 주소로 저장한다.
간단한한 형식으로 보자면
int a = 5;
int *pa = &a;
여기서 포인터변수pa 에 a라는 주소가 저장되었는데 포인터는 a를 가리킨다고 한다.
포인터변수는 포인터형에 관계 없이 항상 크기가 4바이트이다. //주소를 저장하기에 4바이트를 가지고 있다.
ex)
int x;
int *p;
p=&x; //p에 x주소를 넣는다.
*p = 10; //p가 가리키는는 변수 . 즉 x에 10을 대입하게 된다.
포인터변수가 가리키는 변수에 접근하는데 사용되는 간접 참조 연산자이다.* 별표..
포인터변수이름 앞에 *를 사용하면 포인터 변수가 가리키는 변수에 접근해서 값을 읽어오거나 변경할 수 있다.
이중포인터
포인터 변수도 주소를 갖기 때문에 포인터 변수의 주소를 저장하는 포인터변수를 선언할 수 있다.
int *형 변수의 주소를 저장하는 변수는 int **형 으로 선언할수 있는데. 이때 사용된 int**를 이중포인터라고 한다.
ex)
int x;
int *p = &x;
int **p = &p; //pp는 이중포인터
pp -> p -> x
int ** int * int
이중 포인터가 가리키는 변수에 접급할때도 간접참조연산자인 *를 사용한다.
만일 이중 포인터가 가리키는 포인터를 이용해서 다시 int 변수에 접근하려면 **처럼 두번 간접참조를 해야한다.
*pp=10; //p에 접근
**pp = 10; // x에 접근
배열과 포인터
배열의 이름이 바로 배열의 시작 주소이므로 배열이름으로 포인터 변수로 사용할 수 있다.
ex)
int arr[5];
int *p = arr;
포인터가 배열 원소를 가리키고 있을 때, 포인터를 이용해서 배열의 해당 원소와 나머지 모든 원소에 접근할수 있다.
ex)
*(p+i) = arr[i]
*(arr+i) = arr[i]
*(p+i) = p[i] // 포인터변수를 마치 배열 이름인것처럼 사용 가능
p+i = &p[i]
배열과 포인터의 차이점
배열은 연속된 같은 데이터형의 변수들의 모임이고, 포인터는 다른 변수의 주소이다.
배열은 일단 메모리에 할당되고 나면 배열의 시작 주소를 변경할수 없지만
포인터변수는 가능하다.
ex) error 배열
int x[5];
int y[5];
x=y; //error
x++;
ex) 포인터
int x[5];
int y[5];
int *p =x;
p=y; //이제부터 포인터는 y의 주소를 값으로 가지고 있으므로 y를 가리키게 된다.
p++;