나의 작은 valley
[C언어] 포인터 그리고 배열 본문
728x90
//포인터와 배열의 유사성
#include <stdio.h>
int main()
{
int arr[10];
const int num = sizeof(arr) / sizeof(arr[0]);
// arr의 크기 나누기 arr 원소의 자료형
for (int i = 0; i < num; ++i)
arr[i] = (i + 1) * 100;
int* ptr = arr;
printf("%p %p %p\n", ptr, arr, &arr[0]);
ptr += 2;
printf("%p %p %p\n", ptr, arr+2, &arr[2]);
return 0;
}
출력)
00000026AA94F4F8 00000026AA94F4F8 00000026AA94F4F8
00000026AA94F500 00000026AA94F500 00000026AA94F500
*ptrt가 가르키는 arr는 사실 &arr[0]의 주소임을 알 수 있다. 또한 포인터, 배열의 주소, 배열 자체에서 2칸을 더 가는 방법을 작성하였다.
cf)배열은 포인트 산술연산을 할 수 없다.
arr += 2; //invalid
cf) 주소의 절대적인 값 자체에는 큰 의미가 없다.
//포인터와 배열의 유사성2
#include <stdio.h>
int main()
{
int arr[10];
const int num = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < num; ++i)
arr[i] = (i + 1) * 100;
int* ptr = arr;
printf("%d %d %d\n", *(ptr+3), *(arr+3),arr[3]); //400 400 400
/*warning*/
printf("%d %d %d\n", *ptr + 3, *arr + 3, arr[3]); //103 103 400
return 0;
}
유희해야될 점)
*(ptr +3)은 포인터 연산자여서 ptr이 가르키는 배열에서 3칸을 더 간 뒤에 있는 원소를 가져오는 반면에
*ptr + 3에서 +3은 산술 연산자여서 ptr이 가르키는 배열의 원소를 가져온 다음에 +3을 해준다.
//포인터와 배열의 유사성3
#include <stdio.h>
int main()
{
int arr[10];
for (int i = 0; i < 10; ++i)
arr[i] = (i + 1) * 100;
int* ptr = arr;
for (int i = 0; i < 10; ++i)
{
printf("%d %d\n", * ptr++, arr[i]);
}
return 0;
}
출력)
100 100
200 200
300 300
400 400
500 500
600 600
700 700
800 800
900 900
1000 1000
++도 포인터 연산자로 쓰일 수 있음을 확인할 수 있다.
728x90
'Computer Science > [C언어] 문법 정리' 카테고리의 다른 글
[C언어] 2차원 배열 문제 (1) | 2022.09.23 |
---|---|
[C언어] 2차원 배열과 메모리 (0) | 2022.09.22 |
[C언어] 포인터의 산술 (1) | 2022.09.21 |
[C언어] 배열의 기본적인 사용법 (0) | 2022.09.20 |
[C언어]포인터의 매개변수 (0) | 2022.09.19 |
Comments