C Language

포인터(Pointer) 포인터 선언 참조법, 포인터 연산

Fullstacknology 2022. 5. 31. 00:42

변수의 주소 예

#include <stdio.h>

void main() {

	int days = 365;
	int month = 12;
	int Table[5] = { 1, 2, 3, 4, 5 };

	printf("days 의 주소는 %x \n", &days);                        // dafde0 이런 식으로 주소값이 할당되고 실행 될 때마다 주소값이 달라진다.
	printf("month 의 주소는 %x \n", &month);
	printf("배열명 Table의 주소는 %x \n", Table);
	printf("배열명 Table의 첫번째 요소의 주소는 %x \n", &Table[0]);
	printf("배열명 Table의 세번째 요소의주소는 %x \n", &Table[3]);

}

 

 

포인터 변수의 사용 예

#include <stdio.h>

void main() {

	int a, b;
	int *p;                     // 포인터 변수는 주소를 가지고 있는 변수이다, 포인터 변수 p 선언

	a = 5000;
	p = &a;                     // 변수의 주소를 치환, 변수 a의 주소를 가르킴, 여기서 p는 자료를 갖는 변수의 '주소'를 갖는다
	b = *p;                     // 변수 a의 값 5000이 b에 저장된다., *p는 주소에 있는 정수형 '자료'를 갖는다.

	printf("%d, %d \n", a, b);
	printf("%d", p);
}

 

void형 포인터

#include <stdio.h>

void main() {                   // 프로그램 실행시에 자료형이 결정되는 경우에 사용
	int a = 100;                // 저장하기 전 명시적 형변환 필요
	char b = 'b';
	void *p = NULL;             // void형 포인터를 선언후 초기화
	p = (int*)&a;               // void형 포인터 p에 int형 변수 a의 주소를 명시적 형변환을 이용하여 대입
	printf("*p = %d\n", *(int*)p);
	p = (char*)&b;              // 명시적 형변환 
	printf("*p = %c\n", *(char*)p); 
}

 

 

포인터와 기억공간의 대응관계

 

포인터 연산의 예 1 

#include <stdio.h>
void main() {
	int* p, a[] = { 10, 20, 30, 40, 50, };
	p = &a[0];                                // 배열의 첫 번째 요소의 주소값을 포인터변수 p에 저장
	printf("*p == % d\n", *p);
	printf("*p++ == %d\n", *p++);             // 포인터 p값 출력 후 주소를 1 증가
	printf("++p == %d\n", *++p);              // int 형일 경우 4byte char은 1byte
	p = p + 2;                                // 포인터 p의 주소를 2 증가 (8byte)
	printf("*p == %d\n", *p);
	printf("a[2] == %d\n", a[2]);
	printf("*p+2 == %d\n", *p + 2);           // *p + 2 는 포인터 p의 값에 2를 더하는 것이다 주소가 아니다. 
}

 

포인터 연산의 예 2

#include <stdio.h>
void main() {
	int* p, * q;
	int a[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
	p = &a[3];
	printf("*p == %d\n", *p);
	printf("*(p+3) == %d\n", *(p + 3));       // *(p+3) 과 *p+3 은 다름에 주의, 배열의 6번째 요소로 주소값 증가
	q = p + 3;
	printf("*q == %d\n", *q);
	printf("p-q == %d\n", p - q);             // 두 포인터 p 와 q 는 뺄셈이 가능하다 덧셈은 불가능하다
	printf("q-p == %d\n", q - p);
}