나의 작은 valley

[C언어] 포인터 그리고 배열 본문

Computer Science/[C언어] 문법 정리

[C언어] 포인터 그리고 배열

붕옥 아이젠 2022. 9. 21. 11:34
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
Comments