코드읽는 법
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 |