24 - 변수 가리키기 (포인터)
#include<stdio.h>
#include<string.h>
int main() {
int a = 20;
int *ptr_a; //가리킬 변수의 형을 적어주고, 별표, 포인터의 이름.
ptr_a = &a; // &a 는 a의 주소를 나타냄.
printf("%d\n", ptr_a);
}
실행 할때마다 출력값은 달라짐. 임의로 공간을 할당하기 떄문.
#include<stdio.h>
int main() {
int a = 20;
int *ptr_a; //가리킬 변수의 형을 적어주고, 별표, 포인터의 이름.
ptr_a = &a; // &a 는 a의 주소를 나타냄.
printf("a의 값 : %d\n", a);
printf("a의 주소값 : %d\n", &a);
printf("ptr_a에 저장된 값 : %d\n", ptr_a);
printf("ptr_a가 가리키는 변수의 값 : %d\n", *ptr_a);
}
#include<stdio.h>
int main() {
int a = 10;
int b = 20;
int *ptr;
ptr = &a;
printf("ptr이 가리키는 변수에 저장된 값 : %d\n", *ptr);
ptr = &b;
printf("ptr이 가리키는 변수에 저장된 값 : %d\n", *ptr);
}
포인터가 가리키는 변수를 바꿀 수 있다.
#include<stdio.h>
int main() {
int a = 10;
int *ptr;
ptr = &a;
printf("a의 값 : %d\n", a);
*ptr = 20;
printf("a의 값 : %d\n", a);
}
포인터를 이용해서 변수의 값을 바꿀 수 있다.
#include<stdio.h>
int main() {
int a = 10;
int *ptr;
ptr = &a;
int **ptr_ptr; // 포인터를 가리키는 포인터
ptr_ptr = &ptr;
printf("a = %d\n", a);
printf("&a = %d\n", &a);
printf("ptr = %d\n", ptr);
printf("&prt = %d\n", &ptr);
printf("ptr_ptr = %d\n", ptr_ptr);
printf("*ptr_ptr = %d\n", *ptr_ptr);
printf("**ptr_ptr = %d\n", **ptr_ptr);
}
포인터를 가리키는 포인터도 가능.
25 - 배열과 포인터의 관계
#include<stdio.h>
int main() {
int a = 10;
int *ptr_a = &a;
printf("ptr_a의 값 : %d\n", ptr_a);
printf("ptr_a + 1 의 값 : %d\n", ptr_a + 1);
// + 1을 하게 되면 포인터가 가리키고 있는 변수의 자료형의 크기만큼
// 바이트 수를 더한다.
}
#include<stdio.h>
int main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (int i = 0; i < 10; i++) {
printf("&arr[%d] = %d\n", i, &arr[i]);
}
}
4씩 증가하는 것을 확인할 수 있다.
#include<stdio.h>
int main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("arr의 값 : %d\n", arr);
// arr은 &arr[0]이랑 같은 뜻.
// arr + 1은 &arr[1]이랑 같은 뜻.
for (int i = 0; i < 10; i++) {
printf("&arr[%d] = %d\n", i, &arr[i]);
}
}
26 - 배열 가리키기 (배열 포인터)
#include<stdio.h>
int main() {
int arr[3] = { 1,2,3 };
int *ptr = arr;
for (int i = 0; i < 3; i++) {
printf("%d ", *(ptr + i));
}
printf("\n");
for (int i = 0; i < 3; i++) {
printf("%d ", ptr[i]);
}
printf("\n");
for (int i = 0; i < 3; i++) {
printf("%d ", i[ptr]);
}
printf("\n");
//arr[i] == *(arr + i) == *(ptr + i) == *(i + ptr) == i[ptr]
}
마지막 for문은 별로 쓰이지 않음. 직관적이지 못해서.
1) ptr = &ptr[0]
2) *ptr == ptr[0]
3) ptr + 1 == ptr에 sizeof(*ptr)을 더한 값.
ptr 대신에 arr를 써도 결과는 같다..
#include<stdio.h>
int main() {
int arr[3] = { 1,2,3 };
printf("arr = %d\n", arr);
printf("arr + 1 = %d\n", arr + 1);
printf("&arr = %d\n", &arr);
printf("&arr + 1 = %d\n", &arr + 1);
}
마지막 줄의 출력 결과는 이전줄의 결과에 12를 더한 값이다.
왜 그럴까?
3) ptr + 1 == ptr에 sizeof(*ptr)을 더한 값. 이라고 했는데,
ptr대신에 &arr을 넣으면 12이다...
다음 배열로 넘어간다고 생각하면 된다...
#include<stdio.h>
int main() {
int arr[3] = { 1,2,3 };
int(*ptr_arr)[3]; //길이 3인 int형 배열을 가리키는 포인터를 선언한 것.
ptr_arr = &arr;
for (int i = 0; i < 3; i++) {
printf("%d\n", (*ptr_arr)[i]);
}
}
이게 배열 포인터이다...
27 - 2차원 배열과 배열 포인터
#include<stdio.h>
int main() {
int arr[2][3] = { {1,2,3}, {4,5,6} };
printf("%d\n", sizeof(arr)); //24
printf("%d\n", sizeof(arr[0])); //12
printf("%d\n", sizeof(arr[0][0])); //4
}
#include<stdio.h>
int main() {
int arr[2][3] = { {1,2,3}, {4,5,6} };
printf("%d\n", &arr);
printf("%d\n", &arr[0]);
printf("%d\n", &arr[0][0]);
}
주소는 다 같다..
#include<stdio.h>
int main() {
int arr[2][3] = { {1,2,3}, {4,5,6} };
int(*ptr)[3] = arr; //3개짜리 일차원 배열을 가리키는 포인터를 만들겠다. 배열 포인터.
// int(*ptr)[3] = &arr[0];
// 1. ptr[i] == arr[i] 인가?? yes.
// 2. ptr[i][j] == arr[i][j] 인가? yes.
// 3. ptr == arr 인가?? yes.
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", ptr[i][j]);
}
printf("\n");
}
// ptr = arr 이라는 말은 ptr = &arr[0] 이란 것이다.
// 즉, ptr은 arr[0]을 가리키고 있다.
}
1) ptr = &ptr[0]
2) *ptr == ptr[0]
3) ptr + 1 == ptr에 sizeof(*ptr)을 더한 값.
이전 강의에서 배웠던 내용.
#include<stdio.h>
int main() {
int arr[2][3] = { {1,2,3}, {4,5,6} };
for (int(*row)[3] = arr; row < arr + 2; row++) {
for (int *col = *row; col < *row + 3; col++) {
printf("%d ", *col);
}
printf("\n");
}
}
row는 3개짜리 배열을 가리키고 있으므로 *row자체가 하나의 배열을 의미함.
따라서 col에는 *row, 즉 &(*row)[0]이 들어가게 됨.
'포너블 멘토링 > 1주차' 카테고리의 다른 글
함수 (1) (0) | 2020.03.29 |
---|---|
배열과 포인터 (3) (0) | 2020.03.29 |
배열과 포인터 (1) (0) | 2020.03.28 |
연산자와 제어문 (3) (0) | 2020.03.26 |
연산자와 제어문 (2) (0) | 2020.03.26 |