#ch13
1. char str1[]="My string"; => 일부는 o, 전체는 x (문자열이 저장된 배열)
char *str2="Your string"; => 일부는 x, 전체는 o (문자열의 주소값을 저장)
2. 포인터 배열(이중 포인터)
int *arr1[20]; => 길이가 20인 int형 포인터 배열 arr1
double * arr2[30]; => 길이가 30인 double형 포인터 배열 arr2
int main(){
int num1=10, num2=20, num3=30;
int* arr[3]={&num1, &num2, &num3};
printf("%d\n", *arr[0]);
printf("%d\n", *arr[1]);
printf("%d\n", *arr[2]);
return 0;
}
##실행 결과
10
20
30
2-1. 문자열을 저장하는 포인터 배열
int main(){
char * str[3]={"apple", "banana", "carrot"};
printf("%s\n", str[0]);
printf("%s\n", str[1]);
printf("%s\n", str[2]);
return 0;
}
#이때 str[0],str[1],str[2] 아닌 *str[0],*str[1],*str[2]는 안됨(실행안됨)
#이때 *str아닌 그냥 str을 이용하는 경우는
=> char str[5] = { "apple" };
printf("%c", str[2]);
큰따옴표로 묶여서 표현되는 문자열은 그 형태에 상관없이 메모리 공간에 저장된 후 그 주소 값이 반환된다
#ch18
1.2차원 배열
arr2d와 arr2d[0]의 주소값은 같지만 영역은 같지 않다
(전체) (일부)
->이때 sizeof(arr2d):배열 전체 크기 , sizeof(arr2d[0]),sizeof(arr2d[1]),...:각 행의 크기 반환
2. 2차원 배열이름을 대상으로 값을 1씩 증가 및 감소하는 경우 각 행의 첫 번째 요소의 주소 값이다.
=>2차원 배열이름의 포인터 형은 배열의 가로길이에 따라서도 나뉜다.
=>최종적으로, 2차원 배열이름의 포인터 형은 (1)가리키는 대상(포인터형), (2)배열이름을 대상으로 값을 1 증가 및 감소시키는 경우 실제 얼마 증가 및 감소?(가로 길이)
ex) int arr[3][4] => 포인터 변수 선언: int (*ptr)[4] (이때, int *ptr[4]와 다르다)
cf>배열의 세로 길이 계산방식
:sizeof(배열이름)/sizeof(배열이름[0])
int main() {
int arr1[2][2] = { {1,2},{3,4} };
int arr2[3][2] = { {1,2},{3,4},{5,6} };
int arr3[4][2] = { {1,2},{3,4},{5,6},{7,8} };
int(*ptr)[2];
int i;
ptr = arr1;
printf("Show 2,2 arr1 **\n");
for (i = 0; i < 2; i++) {
printf("%d %d\n", ptr[i][0], ptr[i][1]);
}
ptr = arr2;
printf("Show 3,2 arr2 **\n");
for (i = 0; i < 3; i++) {
printf("%d %d\n", ptr[i][0], ptr[i][1]);
}
ptr = arr3;
printf("Show 4,2 arr3 **\n");
for (i = 0; i < 2; i++) {
printf("%d %d\n", ptr[i][0], ptr[i][1]);
}
return 0;
}
##실행결과
** Show 2,2 arr1 **
1 2
3 4
** Show 3,2 arr2 **
1 2
3 4
5 6
** Show 4,2 arr3 **
1 2
3 4
5 6
7 8
3. 포인터 배열 vs 배열 포인터
(1)포인터 배열 : int * arr1[4]; #포인터 변수로 이루어진 배열
(2)배열 포인터 : int (*arr2)[4]; #배열을 가리킬 수 있는 포인터 변수
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void ShowArr2DStyle(int(*arr)[4], int column) {
int i, j;
for (i = 0; i < column; i++) {
for (j = 0; j < 4; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
printf("\n");
}
int Sum2DArr(int arr[][4], int column) {
int i, j, sum = 0;
for (i = 0; i < column; i++) {
for (j = 0; j < 4; j++) {
sum += arr[i][j];
}
}
return sum;
}
int main() {
int arr1[2][4] = { 1,2,3,4,5,6,7,8 };
int arr2[3][4] = { 1,1,1,1,3,3,3,3,5,5,5,5 };
ShowArr2DStyle(arr1, sizeof(arr1) / sizeof(arr1[0]));
ShowArr2DStyle(arr2, sizeof(arr2) / sizeof(arr2[0]));
printf("arr1의 합:%d\n", Sum2DArr(arr1, sizeof(arr1) / sizeof(arr1[0])));
printf("arr2의 합:%d\n", Sum2DArr(arr2, sizeof(arr2) / sizeof(arr2[0])));
return 0;
}
4. 2차원 배열도 arr[i]==*(arr+i)
int arr[3][2]={{1,2},{3,4},{5,6}};
arr[2][1]==(*(arr+2)[1]);
arr[2][1]==*(arr[2]+1));
arr[2][1]==*(*(a+2)+1));
(결과:6)
'C' 카테고리의 다른 글
220809(CH25) (0) | 2022.08.09 |
---|---|
220802(CH23) (0) | 2022.08.02 |
220728(CH21) (0) | 2022.07.28 |
220721(CH16) (0) | 2022.07.26 |
220714(CH10) (0) | 2022.07.14 |