본문 바로가기
Study/C언어

C언어 - 여러가지 포인터와 배열의 조합, 출력값

by 멘탈은안녕하신가 2018. 12. 20.
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
반응형

댓글