변수의 주소 예
#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);
}
'C Language' 카테고리의 다른 글
포인터와 배열의 상관 관계, 포인터 배열, 이중 포인터 (0) | 2022.06.01 |
---|---|
1,2,3 차원 배열과 char형 배열 (0) | 2022.05.18 |