본문으로 바로가기

C언어 공부 정리4(다차원 포인터)

category C언어/C 2020. 11. 26. 14:26

코드읽는 법

 1. 이름을 기준으로 오른쪽부터 읽는다.

 2. 오른쪽을 다 읽으면 왼쪽을 읽는다.

 

 : 파악해야할 것

   - 정체 파악

   - 용도 파악

int a[10];	// 1. 10개짜리 배열
		// 2. int 
        
int *p;		// 1.pointer 2. int

int *p[3];	// 1. 3개짜리 배열
		// 2. int*
        
int (*p)[3];	// 1. pointer
		// 2. int [3]  ---> ex) int a[2][3]
    
int **pp;	// 1. *	2. int*		차원 포인터를 가르키는 포인터

int *(*p) (int a);	// 1. pointer
			// 2. 매개변수를 int를 받고 리턴타입이 포인터인 메소드

 

 

int* p[3];

: 같은 타입이지만 따로 있는 변수를 배열처럼 사용할 떄

#include<stdio.h>

int main()
{
	int* p[3];	// 1. array[3]  2. int*		=>	1차원 포인터 배열
			// 포인터배열(Pointer Array) : 포인터 일괄처리 목적
			// 같은 타입을 배열이 아닌데 배열로 묶어서 사용할 수 있다.


	int a = 3;
	int b = 4;
	int c = 5;
	int i;

	// 포인터 초기화
	p[0] = &a;
	p[1] = &b;
	p[2] = &c;

	for (i = 0; i < 3; i++) 
	{
		printf("%d\t", *p[i]);	// 포인터로 값 출력
	}
	printf("%d\t%d\t%d\n", &a, &b, &c);	// 원래 주소
	for (i = 0; i < 3; i++)
	{
		printf("%d\t", p[i]);	// 포인터가 가르키는 주소
	}
}

 

 

int(*p)[3];

: 다차원 배열을 사용할 때

#include<stdio.h>

int main()
{
	int(*p)[3];	// 한 행당 3개의 요소를 가지고 있는
			// 배열을 가르키는 포인터
			// 요소는 int
            // []안에 숫자는 배열에 맞춰서 (배열 이름 기준 바로 오른쪽 1개 제외하고 다)

	int a[3][3] = { 1,2,3,4,5,6,7,8,9 };

	int* p1;
	int i, j;
	p1 = a[0];	// *a, &a[0][0];	원래는 다차원에 맞춰서 선언해줘야함

	p = a;	// 2차원 포인터이기 때문에 2차원 주소를 받으면 됨

	for (i = 0; i < 3; i++) {
		for(j = 0; j < 3; j++) {
			printf("%d %d %d\n", a[i][i], *(a[i] + j), *(*(a + i) + j));
			printf("%d %d %d\n", p[i][i], *(p[i] + j), *(*(p + i) + j));
		}
	}
}

 

int** pp;

 : Pointer's pointer

 : 포인터를 가르킬 수 있는 포인터, 건너의 건너

#include<stdio.h>

int main()
{
	int** pp;	// 1. pointer  2, int*	
	int* p;
	int a = 10;

	p = &a;
	pp = &p;

	printf("%d %d %d\n", a, *p, **pp);	// a의 value
	printf("%d %d %d\n", &a, p, *pp);	// a의 주소
	printf("%d %d %d\n", &p, pp, &pp);	// p의 주소

	return 0;
}
#include<stdio.h>

int main() 
{
	// 변수 선언
	int a = 10;
	int b = 20;
	int c = 30;
	int i;

	// 포인터 선언
	int* p[3];
	int** pp;

	// 포인터 초기화
	pp = &p;

	*pp = &a;
	*(pp + 1) = &b;
	*(pp + 2) = &c;

	printf("a Value : %d\tAddress : %d\n", a, &a);
	printf("b Value : %d\tAddress : %d\n", b, &b);
	printf("c Value : %d\tAddress : %d\n", c, &c);
	
	printf("---------------------------------\n");

	for (i = 0; i < 3; i++)
	{
		printf("p Value : %d\t", **(p + i));
		printf("p Address : %d\n", *(p + i));
	}

	printf("---------------------------------\n");

	for (i = 0; i < 3; i++)
	{
		printf("pp Value : %d\t", **(pp + i));
		printf("pp Address : %d\n", *(pp + i));
	}
	return 0;
	
}

 

 

포인터 이동 확인 연습

#include<stdio.h>

int main() {
	int* ptr;
	int n[] = { 5,10,22,34,36,44 };

	ptr = n;

	printf("%d\t", *ptr++);		printf("%d\n", *ptr);
	printf("%d\t", *ptr+1);		printf("%d\n", *ptr);
	printf("%d\t", ++*ptr);		printf("%d\n", *ptr);
	printf("%d\t", *(ptr+1));	printf("%d\n", *ptr);
	printf("%d\t", *ptr+=1);	printf("%d\n", *ptr);
	printf("%d\t", *++ptr);		printf("%d\n", *ptr);
	printf("%d\t", (*ptr)++);	printf("%d\n", *ptr);

}

반응형

'C언어 > C' 카테고리의 다른 글

C언어 공부 정리6(동적 메모리)  (0) 2020.11.30
C언어 공부 정리5(구조체)  (0) 2020.11.27
C언어 공부정리3(포인터)  (0) 2020.11.25
C언어 공부정리2(배열의 주소값)  (0) 2020.11.24
C언어 공부 정리1  (0) 2020.11.23