728x90
반응형
1. 기본 출력
- 코드
#include <stdio.h>
int main (void)
// 1.
{
int a =1, b=2, c=3;
int *sum=&a;
printf("*sum = %d\n", *sum); // 1 출력
printf("&a = %d\n", &a); // 주소값 출력
printf("a = %d\n", a); // 1 출력
*sum = 123; // sum이 가리키고 있는 a값에 123 입력
printf("*sum = %d\n", *sum); // 123 출력
printf("a = %d\n", a); // 123 출력
sum = 123;
printf("sum = %d\n", sum); // 123 출력
printf("a = %d\n", a); // 123출력
return 0;
}
- 출력
2. 상수와 주소값 64비트 출력
- 코드
#include <stdio.h>
int main (void)
// 2.
{ // %d는 상수, %p는 주소값을 나타내는 매개변수 / 64비트
int arr[3] = {1,2,3};
int *ptr = arr;
int arr1 = 1;
int ptr1 = arr; // ptr1=&arr과 같음 - 빌드는 되지만 오류
int *ptr2 = &arr1;
printf("%d, %d, %d, %d\n",*ptr, ptr, arr, &arr); // 1, 쓰레기값(1), 쓰레기값(1), 쓰레기값(1)
printf("%d, %d, %d, %d\n", ptr2, *ptr2, arr1, &arr1); // 쓰레기값(2), 1, 1, 쓰레기값(2)
printf("%d, %d, %d, %d\n", ptr1, arr[0], arr[1], &arr[0]); // 쓰레기값(1),1 , 2, 쓰레기값(1)
printf("%p, %p, %p, %p\n",*ptr, ptr, arr, &arr); // 00000001, 쓰레기값(1), 쓰레기값(1), 쓰레기값(1)
printf("%p, %p, %p, %p\n", ptr2, *ptr2, arr1, &arr1); // 쓰레기값(2), 1, 1, 쓰레기값(2)
printf("%p, %p, %p, %p\n\n", ptr1, arr[0], arr[1], &arr[0]); // 쓰레기값(1), 1, 00000002, 쓰레기값(1)
*ptr=0;
printf("%d, %d, %d, %d\n",*ptr, ptr, arr, &arr); // 0, 위와같음
printf("%d, %d, %d, %d\n", ptr2, *ptr2, arr1, &arr1); // 위와같음
printf("%d, %d, %d, %d\n", ptr1, arr[0], arr[1], &arr[0]); // 위와같음, 0, 위와같음
printf("%p, %p, %p, %p\n",*ptr, ptr, arr, &arr); // 00000000, 위와같음
printf("%p, %p, %p, %p\n", ptr2, *ptr2, arr1, &arr1); // 위와같음
printf("%p, %p, %p, %p\n\n", ptr1, arr[0], arr[1], &arr[0]); // 위와같음, 0000000, 위와같음
arr[0] = 1;
printf("%d, %d, %d, %d\n",*ptr, ptr, arr, &arr); // 맨 위의 값과같음
printf("%d, %d, %d, %d\n", ptr2, *ptr2, arr1, &arr1); // 맨 위의 값과같음
printf("%d, %d, %d, %d\n", ptr1, arr[0], arr[1], &arr[0]); // 맨 위의 값과같음
return 0;
}
- 출력
3. 배열의 수와 길이
- 코드
#include <stdio.h>
int main (void)
// 3.
{
int arr[4] = {1, 2, 3, 4}; //배열의 수와 값의 수가 같아야 함.
int *ptr = arr;
//쓰레기 값, 첫번째 값
//ptr에 들어있는 값의 주소(쓰레기 값), 첫번째 값의 주소
printf("%d, %d\n", ptr, *ptr);
printf("%p, %p\n\n", ptr, *ptr);
printf("배열 : %d, %d, %d, %d\n", arr[0], arr[1], arr[2], arr[3]); //1, 2, 3, 4
printf("배열 : %p, %p, %p, %p\n\n", arr[0], arr[1], arr[2], arr[3]);
//첫번째 값+1, 첫번째 값+2, 첫번째값 선위 증가, 3번째에서 증가된 값(2)+1
//바로 위에서 선위증가가 일어나서 나온값의 주소+1, 주소+2, 바라보는 주소 선위증가, 주소+1
printf("%d, %d, %d, %d\n",*(ptr + 1), *(ptr + 2), *(++ptr), (*ptr + 1));
printf("%p, %p, %p, %p\n\n",*(ptr + 1), *(ptr + 2), *ptr, (*ptr + 1));
printf("배열 : %d, %d, %d, %d\n", arr[0], arr[1], arr[2], arr[3]); //1, 2, 3, 4
printf("배열 : %p, %p, %p, %p\n\n", arr[0], arr[1], arr[2], arr[3]);
//기존 쓰레기값+4(한칸 이동), 위에서 선위증가 한번 일어나서 바라보는 값(배열 두번째 값)
//동일하게 주소도+4, 마찬가지로 선위증가 한번 일어난 주소(배열 두번째 주소)
printf("%d, %d\n", ptr, *ptr);
printf("%p, %p\n\n", ptr, *ptr);
printf("배열 : %d, %d, %d, %d\n", arr[0], arr[1], arr[2], arr[3]); //1, 2, 3, 4
printf("배열 : %p, %p, %p, %p\n\n", arr[0], arr[1], arr[2], arr[3]);
//배열의 두번째 값, 현재 포인터가 바라보는 값(2), 포인터가 바라보는 값에서 선위증가 값(3), 3번에서 값의 증가가 발생한 배열의 두번째 값, 현재 포인터가 바라보는 값(3)
//배열의 두번째 주소(앞에서 바라보는 값이 변경된 주소), 포인터가 바라보는 값의 주소
printf("%d, %d, %d, %d, %d\n", arr[1], *ptr, ++(*ptr), arr[1], *ptr);
printf("%p, %p, -, -, -\n\n", arr[1], *ptr);
//여기서 (*ptr) 연산은 '값' 자체를 수정(2 더하기 1은 3 이 아님)하는게 아니라 포인터가 바라보는 값을 바꾼것(바라보는 값이 2에서 1을 더해 3으로 변경, 주소도 함께 변함)이라는 것을 알수 있다
printf("배열 : %d, %d, %d, %d\n", arr[0], arr[1], arr[2], arr[3]); //1, 3, 3, 4
printf("배열 : %p, %p, %p, %p\n\n", arr[0], arr[1], arr[2], arr[3]);
//포인터가 바라보는 값 후위 연산(기존 값 3), 앞에서 후위연산된 값(4)
//포인터가 바라보는 값의 주소
printf("%d, %d\n", (*ptr)++, *ptr);
printf("-, %p\n\n", *ptr);
//쓰레기 값은 포인터 ptr에 직접적으로 연산을 한 *(++ptr)에서 한칸만 변화(+4)가 일어났고, 포인터가 바라보는 값은 총 3번의 변화(직접 연산 19번 *(++ptr), 주소 변경 연산 35번 ++(*ptr), 44번 (*ptr)++)가 일어났다.
printf("%d, %d\n", ptr, *ptr);
printf("%p, %p\n", ptr, *ptr);
return 0;
}
- 출력
728x90
반응형
'Study > C언어' 카테고리의 다른 글
C언어 - 배열과 스택, 버퍼 오버플로우 (0) | 2020.06.03 |
---|---|
C언어 - 다양한 자료형의 10진수 정수값 구하기 & 오류가 나는 이유 (0) | 2018.12.20 |
C언어 - 2차원 배열과 메모리 크기 (0) | 2018.12.20 |
C언어 - 포인터 Call-By-Value와 Call-By-Reference의 구분, 더블포인터의 이해 (0) | 2018.12.17 |
C언어 - sacnf의 &(주소연산자) (0) | 2018.12.17 |
댓글