C언어 - 포인터 연산 총정리
2020. 11. 12. 11:13ㆍ개인공부/C언어
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int arr[5] = { 100,200,300,400,500 };
int* ptr1, * ptr2, * ptr3;
ptr1 = arr; // Assignment
// 포인터에 주소를 대입할수있다.
// 포인터 변수는 변수명 자체가 주소와 비슷한 기능을 한다.
// 만약 arr이 배열이 아니라 일반적인 변수였다면(int i같은)
// &i 처럼 &를 붙여서 주소를 가져와야 한다.
printf("%p %d %p : ptr1, *ptr1, &ptr1\n", ptr1, *ptr1, &ptr1);
// dereferencing, Taking a pointer
// 포인터 앞쪽에 *를 붙이면 변수에 저장된 주소로 가서 그 주소에 있는 값을 가져온다.
// ptr1 이 16진수 주소값이라면, *ptr1은 16진수 주소값으로 가서 그 주소의 데이터를 가져오는것
//&ptr1 포인터 변수자체도 변수이기때문에 주소값을 저장하기 위한 주소가 있다. (가리키는 주소가 아닌 자신의 주소)
ptr2 = &arr[2]; // Address-of operator &
// 배열 인덱싱은 0으로 부터 시작한다.
printf("%p %d %p : ptr2, *ptr2, &ptr2 \n", ptr2, *ptr2, &ptr2);
ptr3 = ptr1 + 4; // Adding an integer from a pointer
// ptr1이 int를 가르킨다. 즉 4를 더하는건
// 4바이트 짜리가 4개 만큼 저장할수 있는 공간을 더하는것.
printf("%p %d %p : ptr3, *ptr3, &ptr3\n", ptr3, *ptr3, &ptr3);
//Differencing
printf("%td : ptr3 - ptr1\n", ptr3 - ptr1); // Note : t is for pointer differnce
//%td는 포인터의 차이값을 출력할때 쓰인다
ptr3 = ptr3 - 4;
printf("%p %d %p : ptr3, *ptr3, &ptr3 (ptr3-4 이후) \n", ptr3, *ptr3, &ptr3);
ptr1++;
ptr1--;
--ptr1;
++ptr1;
if (ptr1 == ptr3) //포인터끼리 비교도 할수있다.
printf("Same : ptr1 == ptr3\n");
else
printf("Different : ptr1 == ptr3\n");
double d = 3.14;
double* ptr_d = &d;
if(ptr1 == ptr_d) // int형 포인터와 double형 포인터 비교
// 둘다 메모리 크기도 같고, 둘다 주소를 가르킨다.
// 대부분 이렇게 비교하는건 프로그래머 실수이다.
// 그래서 build때 워닝이 뜸.
// 둘중 하나를 (double*)이나 (int*)로 캐스팅 하면됨.
printf("Same : ptr1 == ptr_d\n");
else
printf("Different : ptr1 == ptr_d\n");
}
결과 값:
출처 : 홍정모의 따라배우는 C언어
'개인공부 > C언어' 카테고리의 다른 글
C언어 - 배열 매개변수와 const (0) | 2020.11.12 |
---|---|
C언어 - const와 배열과 포인터 (0) | 2020.11.12 |
C언어 - 배열을 함수에게 전달해주는 방법 (0) | 2020.11.12 |
C언어 - 2차원 배열과 메모리 (0) | 2020.11.11 |
C언어 - 포인터와 배열 (0) | 2020.11.11 |