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 |
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 | 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 | 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 | 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 | 5 |
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 | 5 |
30 |
4 |
*pt+++= 20은 pt++ += 20 이므로 pt += 20 을 한 뒤, pt++을 한다
pt = pt + 20 = 10 + 20 = 30 이고, pt++해서 pt는 num[3]의 주소 가리키게 됨
답은 1 5 30 4
'언어 > 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 |
댓글