카테고리 없음

C언어 정보처리기사 - 배열과 포인터(pointer)

백코딩 2023. 9. 30. 22:29
728x90

포인터(pointer)란 메모리의 주소값을 저장하는 변수이며, 포인터 변수라고 부른다.

말 그대로 뭔가를 가리키는 의미를 가지고 있다. (주소값을 가리킴)

chart형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장한다.

 

int *p = NULL;
int *a;
*a = 10;
printf("%d", a);
printf("%d", *a);

 

int *a -> a라는 변수를 만들고 메모리와 상관 없이 변수 a를 만들어놓고 주소값을 가지는 특징이 있다. 보통 변수는 아니고 포인터 변수다.

*a = 10 -> *a는 a의 값이라고 해석하고, a에 값에 해당하는 메모리 주소의 메모리 '주소의 값'에 10을 할당해라

 

printf("%d", a); = 102 -> 변수 a에 할당된 값(메모리 주소) (102는 임의로 만든 주소입니다.)

printf("%d", *a); = 10 -> a의 값 즉, 102에 할당된 메모리 주소의 값 10

 

 

포인터 변수의 크기는 주소를 가리키기 때문에 항상 4byte의 동일한 크기를 가진다.

 

1) 주소 연산자(&)

주소 연산자는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환한다.

 

2) 참조 연산자(*)

참조 연산자는 포인터의 이름이나 주소 앞에 사용하여, 포인터에 가리키는 주소에 저장된 값을 반환한다.

dereference라고 하여 역참조연산자라고 한다.

 

포인터는 하나만 알면된다.

*p는 선언할 때를 제외하고 무조건 값을 가리킨다고 생각하면 되고 &는 주소를 가리킨다고 생각하면 된다.

 

1차원 배열에서 배열명은 주소값을 나타낸다.

int a[2] = {1,2};
int *p;

p = a;와 같이 사용할 수 있다.

또한 배열의 값에 접근하기 위해서 a[0]과 같이 사용하고 이 값의 주소값을 구하기 위해 '&'를 붙여준다. 즉 p = &a[0]; 와 같이 사용할 수 있다는 것이다.

 

문제) 

단, 아래의 scanf()함수의 입력으로 90을 타이핑했다고 가정

int main(){
	int i = 10;
    int j = 20;
    int *k = &i;
    
    scanf("%d", k);
    printf("%d, %d, %d₩n", i, j, *k);
}

답) 90, 20, 90

 

해설 ) scanf에 90입력으로 k는 i의 주소를 참조하고 있기에 90을 입력하면 i의 값이 10에서 90으로 바뀐다.

그래서 i는 90, j는 20, *k의 값 또한 i의 주소값을 참조하고 있기에 i의 90이랑 같다

 

문제) 배열과 포인터

#include<stdio.h>
int main(void){
	int i;
    int a[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
    int *ptr = a + 3;
    for(i = 0; i < 5; i++){
    	printf("%d", *(ptr+i)-3);
    }
}

답 : 37 47 57 67 77

 

 

! 배열과 포인터의 관계

int a[5];

int *b = a;

a[2] = 10;

b[2] = 20;

 

10에서 20으로 값이 바뀐다.

 

문제) 

int a[] = {1,2,4,8};
int *p = a;
p[1] = 3;
a[1] = 4;
p[2] = 5;
printf("%d%d₩a", a[1] + p[1], a[2] + p[2]);

답 : 8 10

 

응용)

int a[] = {1,2,4,8};
int *p = a+1
p[1] = 3;
a[1] = 4;
p[2] = 5;
printf("%d%d₩a", a[1] + p[1], a[2] + p[2]);

답 : 7 8

해설) P에 주소 시작이 다르니 헷갈릴수 있다는 점이 있다.

 

문제)

#include<stdio.h>
int main(void){
	int a[4] = {10, 20, 30};
    int *p = a;
    p++;
    *p++ = 100;
    *++p = 200;
    printf("a[0]=%d, a[1]=%d, a[2]=%d₩", a[0], a[1], a[2]);
}

답 : a[0] = 10, a[1] = 100, a[2] = 30

 

int num[4] = {1,2,3,4};
int *pt = num;
pt++;
*pt++ = 5;
*pt++ = 10;
pt--;
*pt+++ = 20;
printf("%d %d %d %d", num[0], num[1], num[2], num[3]);

답 : 1 5 30 4

 

주의)

*pt+++ = 20;

1) *pt += 20;

2) *pt++;

 

728x90