본문 바로가기
C

220726(CH13,18)

by 덤더리덤떰 2022. 7. 26.

#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