포인터

·2023년 3월 5일
0

C

목록 보기
3/13

📌포인터


메모리 상의 특정한 데이터의 주소값을 보관하는 변수
(포인터도 변수의 한 종류)

&연산자

&(주소를 계산할 데이터)

특정한 데이터의 메모리 상의 주소를 알 수 있다

*연산자

저장된 주소값에 위치한 데이터

왜 포인터에 타입이 있을까

int a;
pointer *p //형태가 없는 포인터라고 가정함
p = &a;
*p = 4;

모든 주소들의 위치가 아닌 시작 주소만 들어가 있기 때문에
*p 여기서 메모리에서 얼마만큼 읽어들여야 하는지 모름


📌상수포인터


const int* p = &a;

p가 가르키는 데이터의 값을 못바꿈

a = 10; //(o)
*pa = 10; //(X)

원래 변수 값은 지정해서 바꿀수 있다.
(p만 상수로 지정되었기에 a는 전혀상관없다.

int* const p = &a;

p가 가르키는 주소의 값을 못바꿈

pa = &b; //(X)

📌배열과 포인터


배열과 포인터 주소값 비교

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* parr;
	int i;

	parr = &arr[0];

	for (i = 0; i < 10; i++)
	{
		printf("arr[%d]의 주소값 : %p  ", i, &arr[i]);
		printf("(parr + %d)의 주소값 : %p", i, (parr + i));

		if (&arr[i] == (parr + i))
		{
			printf("-->일치\n");
		}
		else printf("--> 비일치\n");
	}

	printf("arr[3] = %d, *(parr + 3) = %d \n", arr[3], *(parr + 3));
	return 0;
}

배열의 주소에 다음 배열이 있어서 포인터로 배열을 사용가능하다.

배열과 포인터 크기비교

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* parr;
	int i;

	parr = &arr[0];

	printf("sizeof(arr) : %d \n", sizeof(arr));
	printf("sizeof(parr) : %d", sizeof(parr));

	return 0;
}

배열을 포인터처럼 쓰는법

#include <stdio.h>

int main() {
  
	int arr[2][2] = { {1,2}, {3,4} };

	printf("%d\n", *arr[0]);
	printf("%d\n", *arr[1]);
	
}

포인트 배열과 배열 포인터의 구분

int (*parr)[3]
int* parr[3]

첫번째는 int형 2차원 배열을 가르키는 배열 포인터(2차원 배열 포인터)
두번째는 int형 배열을 가르키는 포인터 배열(배열의 요소가 포인터이다)

배열과 포인터 관계

  1. sizeof와 주소값 연산자와 함께 사용할 때를 제외하면, 배열의 이름은 첫번째 원소를 가르킨다.
  2. arr[i]와 같은 문장은 컴파일러에 의해 *(arr +i)로 변환된다.

arr와 arr[0]의 주소값은 왜 동일할까?
C 언어 상에서 배열의 이름이 sizeof 연산자나 주소값 연산자(&)와 사용될 때를 제외하고
배열의 이름을 사용시 암묵적으로 첫 번째 원소를 가르키는 포인터 타입으로 변환되기 떄문에 arr와 arr[0]의 주소값은 동일하다

[]에 관해서

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };


	printf("arr[3] : %d\n", arr[3]);
	printf("3[arr] : %d\n", 3[arr]);
	printf("*(3+a) : %d", *(arr + 3));
	return 0;
}

arr[3]이 컴파일러에 의해 *(arr +3)로 변환된다.

int main()
{
	int arr[3] = { 1, 2, 3 };
	int* parr;
									 
	parr = arr;						 
									 
	printf("arr[1] : %d \n", arr[1]);
	printf("parr[1] : %d \n", parr[1]);
	return 0;
}

📌이중포인터

int main()
{
	int a;
	int* pa;
	int** ppa;

	pa = &a;
	ppa = &pa;

	a = 3;
	printf("a : %d // *pa : %d // **ppa : %d \n", a, *pa, **ppa);
	printf("&a : %p // pa : %p // *ppa : %p \n", &a, pa, *ppa);
	printf("&pa : %p // ppa : %p \n", &pa, ppa);
	return 0;
}

문제(제어문관련)


Problem.c

참고자료


씹어먹는 C언어
TCPSchool

profile
개인공부저장용(하루의 기록)

0개의 댓글