본문 바로가기
언어/C

[c언어] 배열과 포인터

by 새벽물망초 2022. 10. 13.

01

#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);
       }
}

int i, 배열 a, 포인터 ptr 선언 

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
10 20 30 40 50 60 70 80 90 100

 

포인터 ptr = a+3

 

i=0, *(a+3+0)-3 하면 *(a+3)-3, *(a[3])-3 이므로 a[3]의 값 40을 부르고 -3을 해서 37

i=1, *(a+3+1)-3, *(a+4)-3, *(a[4])-3, 50-3 = 47

i=2, *(a+3+2)-3, *(a+5)-3, *(a[5])-3, 60-3 = 57

i=3, *(a+3+3)-3, *(a[6])-3, 70-3 = 67
i=4, *(a+3+4)-3, *(a[7])-3, 80-3 = 77

i=5 종료

정답 : 37 47 57 67 77

+해설추가)

포인터 변수 ptr = a+3 는 예를들어, 배열 a[0]의 메모리주소가 100이면

ptr = 100 + 3 = 103 이 되어버린다. 따라서 메모리주소 103을 가리키고

메모리주소 103에 든 값은 배열 a[3] 의 값이다

print문에서 *(ptr+i)는 주소 103 + for문의 i 시작값이 0이므로 *(103+0)이 되고

변수 선언이 아닌 문장에서 *는 그 포인터 변수에 저장된 값을 불러오라 라는 뜻이고

a[3]=40의 값을 불러와야 함.

 

 

 

02

⭐개념

int a[5]

int *b = a

a[2] = 10

b[2] = 20

a[0] 1 2 3 4
    10
20
   

배열 a[5] 선언, 포인터 변수b = a 선언

만약 a[0]의 주소가 100이면, 포인터변수 b=100 이다( *b = a 이므로) ※포인터 변수는 메모리 주소 저장

그리고 b와 a는 같은 메모리 주소를 공유하기 때문에 b[2] = 20 을 하면 a[2] = 20 으로 덮어진다

 

 

#include<stdio.h>
int main(void){
	int a[] = {1,2,4,8};
    int *p = a;
    p[1]=3;
    a[1]=4;
    p[2]=5;
    printf("%d %d\n", a[1]+p[1], a[2]+p[2]);
    return 0;
}

배열 a선언

a[0] a[1] a[2] a[3]
1 2
3
4
4
5
8

 

포인터 변수 p = a , p에 a의 주소값이 저장됨, 따라서 p와 a는 서로 주소는 공유한다고 봄

p[1]=3은 p[1]의 메모리 주소를 찾아가서 그 곳에 3의 값을 저장한다

즉, a[1]의 위치에 저장

a[1]=4는 그대로 4 저장

p[2]=5는 p[2]의 같은 메모리주소 a[2] 찾아가서 5 저장

답은 4+4, 5+5 해서

정답: 8 10

 

 

 

03

#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\n", a[0], a[1], a[2]);
}

배열 a 

a[0] 1 2 3
10 20 30
100
200

포인터 변수 p = a 는 p에 a의 주소가 저장된다 라는 뜻

 

p++ 하면 a의 주소가 1씩 증가함

*p++ 은 a의 주소가에 또 1 증가시킨 메모리 주소에 있는 값에 100을 대입

답은 a[0]=10, a[1]=20, a[2]=100

인줄 알았다면 틀렸다.

 

a[0] 1 2 3
10 20
100
30 200

먼저 p++ 에 의해 a의 주소가 1 증가했다 ( a[1] )

그다음 *p++ = 100 은 후위연산자이므로 1. p에 100을 집어넣고, 2. p++을 한다

따라서 a[1]=100 이 되고, p++을 실행해서 a[2]를 가리키게 된다

그다음 *++p = 200 이므로 a[3]에 200을 집어넣는다

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

 

 

 

04

#include <stdio.h>
void main() {
	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]);
}

num 배열

num[0] 1 2 3
1 2
5
3
10
20
4

pt 포인터 변수에 num의 주소 저장됨

 

pt++ 해서 num[1] 가리킴

*pt++ = 5는 후위연산자이므로 num[1]=5를 대입하고 pt++ 해서 pt = num[2]의 주소를 가리키게 됨

*pt++ = 10는 마찬가지로 num[2]=10 대입 후, pt=num[3]이 됨

pt-- 되어서 num[2] 가리키게 됨

*pt+++ = 20은 num[2]에 20 대입 후, pt=num[4] 되는데 존재하지 않음. (?)

답은 1 5 20 4

가 아니라

 

num[0] 1 2 3
1 2
5
3
10
30
4

*pt+++= 20은 pt++ += 20 이므로 pt += 20 을 한 뒤, pt++을 한다

pt = pt + 20 = 10 + 20 = 30 이고, pt++해서 pt는 num[3]의 주소 가리키게 됨

답은 1 5 30 4

 

 

https://www.youtube.com/watch?v=3bpOudxSvL0&list=PLdaE6YENrbZA8sXCvVBUWjFwFI2zb4tlK&index=28&ab_channel=%ED%9D%A5%EB%8B%AC%EC%8C%A4 

 

'언어 > C' 카테고리의 다른 글

포인터 배열  (0) 2022.10.13
2차원 배열과 포인터  (0) 2022.10.13
[C언어] 비트연산자  (0) 2022.07.21
[C언어] 사용자 정의 함수  (0) 2022.07.11
[C언어] 포인터  (0) 2022.04.16

댓글