๐ซก ๋ค๋ฒ์งธ ํฌ์คํ ๋ถํฐ๋ C์ธ์ด ์ฌํ ๊ฐ๋ ์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋๊ฐ๋ค! ์ ์ ํฅ๋ฏธ์์ด์ง๋ C์ธ์ด! ๋ ๋ฒ์งธ ํํธ 11์ฅ๋ถํฐ 15์ฅ๊น์ง ์ ๋ฆฌํ๋ค.
11. 1์ฐจ์ ๋ฐฐ์ด
โ ๋ฐฐ์ด์ด๋?
→ ๋ค์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ ๊ฒ. ์ฌ๋ฌ ๊ฐ์ ๋ณ์๋ฅผ ์ ์ฅํ ํ์ ์์ด, ํ ๋ฒ์ ๋ง์ ์์ ๋ณ์ ์ ์ธ ๋ฐ ์ ์ฅ ๊ฐ๋ฅ!
โก 1์ฐจ์ ๋ฐฐ์ด ์ ์ธ & ์ ๊ทผ
→ ํ์ํ ๊ฒ: ๋ฐฐ์ด์ด๋ฆ, ์๋ฃํ, ๊ธธ์ด์ ๋ณด
ex) int arr1[7];
: intํ ๋ณ์ 4๊ฐ๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ ๋ง๋ค๊ณ , ๊ทธ ๋ฐฐ์ด์ ์ด๋ฆ์ arr1๋ก ํ๋ค๋ ๋ป์ด๋ค. intํ ๋ณ์ 4๊ฐ๊ฐ ๋๋ํ ์ ์ธ๋์๊ณ , ์ค์ ๋ก ๋ฐฐ์ด์ ์ด๋ฃจ๋ ์์๋ค(๋ณ์๋ค)์ ์ฃผ์ ๊ฐ์ ํ์ธ ํด๋ณด๋ฉด ๋๋ํ ๋ฐฐ์น๋์ด ์๋ค.
ex) float arr2[10]; double arr3[12];
→ ์ ๊ทผํ๊ธฐ ์ํด์๋ [] ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๊ณ ์๋ฅผ ๋ค์ด arr[idx] = 20; ์ด๋ผ๋ ์ฝ๋๋ ๋ฐฐ์ด arr์ idx+1 ๋ฒ์งธ ์์์ 20์ ์ ์ฅํ๋ค๋ ๋ป์ด๋ค. []์์ ๋ค์ด๊ฐ๋ ์ซ์๋ฅผ index(์ธ๋ฑ์ค ๊ฐ)๋ผ ํ๊ณ , ์ด ๋ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ์ง์นญํ ๋ ์ฌ์ฉ๋๋ ์ซ์๊ฐ 1์ด ์๋๋ผ 0์ด๋ค.
ex)
#include <stdio.h>
int main(void) {
int arr[5];
int sum = 0, i;
arr[0] = 10, arr[1] = 20, arr[2] = 30, arr[3] = 40, arr[4] = 50;
for(i=0;i<5;i++){
sum += arr[i];
}
printf("total in arr is %d\n",sum);
return 0;
}
→ ๋ฐ๋ผ์, ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํด์ ์์ฐจ์ ์ผ๋ก ์ ๊ทผํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. ๋ค์์ ๋ณ์๋ฅผ ์ ์ธ์ด ์๋๋ผ, ๋ฐ๋ณต๋ฌธ ๊ธฐ๋ฐ์ผ๋ก ์์ฐจ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
→ ๋ง์ฝ, ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ 3์ธ ๋ฐฐ์ด์ธ๋ฐ 4๋ฒ์งธ ์์์ ์ ๊ทผ์ ์๋ํ๋ค๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋์ง ์๋๋ค. ๋ฐ๋ผ์ ๋ ์ฃผ์. ํ ๋นํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์นจ๋ฒํ๋ ๋ฌธ์ ์ ๋ฐ์(์ ์์ ์์ i๊ฐ 5๊น์ง ์งํ๋๊ฒ ํ๊ณ ํฉ๊ณ๋ฅผ ๊ตฌํ๋ฉด ๋งค์ฐ ํฐ ์ซ์๊ฐ ๋์ด)
โข ๋ฐฐ์ด์ ์ ์ธ๊ณผ ๋์์ ์ด๊ธฐํ / ๋ฐฐ์ด์ ๊ธธ์ด, ๋ฐ์ดํธ ๋จ์์ ๋ฐฐ์ด ํฌ๊ธฐ
(1) int arr1[5] = {1, 2, 3, 4, 5};
(2) int arr2[] = {1, 2, 3, 4, 5, 6, 7}; (์ปดํ์ผ๋ฌ๊ฐ ์ด๊ธฐํ ๋ฆฌ์คํธ์ ์๋ฅผ ์๋ ์ฐธ์กฐํ์ฌ ๊ธธ์ด์ ๋ณด๋ฅผ ์ฑ์์ค๋ค - ๋ฐฐ์ด์ ๊ธธ์ด ์ ๋ณด ์๋ต ๊ฐ๋ฅ)
(3) int arr3[5] = {1, 2}; (์ฒซ๋ฒ์งธ ์์๋ถํฐ ์์ฐจ์ ์ผ๋ก ๊ฐ์ ์ฑ์๋๊ฐ๋ ์ฑ์ธ ๊ฐ์ด ์กด์ฌํ์ง ์๋ ์์๋ค์ 0์ผ๋ก ์ฑ์์ง๋ค)
ex)
#include <stdio.h>
int main(void) {
int arr1[5] = {1, 2, 3, 4, 5};
int arr2[] = {1, 2, 3, 4, 5, 6, 7};
int arr3[5] = {1, 2};
int ar1Len, ar2Len, ar3Len, i;
printf("the size of arr1: %d\n",sizeof(arr1));
printf("the size of arr2: %d\n",sizeof(arr2));
printf("the size of arr3: %d\n",sizeof(arr3));
ar1Len = sizeof(arr1)/sizeof(int); // length of arr1
ar2Len = sizeof(arr2)/sizeof(int);
ar3Len = sizeof(arr3)/sizeof(int);
for(i=0;i<ar1Len;i++)
printf("%d ",arr1[i]);
printf("\n");
for(i=0;i<ar2Len;i++)
printf("%d ",arr2[i]);
printf("\n");
for(i=0;i<ar3Len;i++)
printf("%d ",arr3[i]);
printf("\n");
return 0;
}
/*
the size of arr1: 20
the size of arr2: 28
the size of arr3: 20
1 2 3 4 5
1 2 3 4 5 6 7
1 2 0 0 0
*/
→ ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํ๊ณ ์ถ๋ค๋ฉด ๋ฐ์ดํธ ๋จ์์ ๋ฐฐ์ด ํฌ๊ธฐ๋ฅผ ๋ฐ์ดํธ ์ฌ์ด์ฆ๋ก ๋๋๋ค๋ฉด ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํ ์ ์๋ค.
ex) ๊ธธ์ด๊ฐ 5์ธ intํ ๋ฐฐ์ด ์ ์ธ - 5๊ฐ์ ์ ์ ์ ๋ ฅ๋ฐ๊ธฐ. ์ ๋ ฅ์ด ๋๋๋ฉด, ์ ๋ ฅ๋ ์ ์ ์ค ์ต๋๊ฐ, ์ต์๊ฐ, ์ ๋ ฅ๋ ์ ์์ ์ด ํฉ ์ถ๋ ฅ
(์ด ๋, ๋ฐฐ์ด ๋์์ผ๋ก scanf ์ ๋ ฅ๋ฐ์ ๋๋ &arr[2]๋ก ์์ &ํ์๋ฅผ ๋ถ์ฌ์ฃผ์ด์ผ ํ๋ค)
#include <stdio.h>
int main(void) {
int arr[5];
int sum = 0;
int max, min;
printf("enter 5 numbers in arr: ");
for(int k = 0; k < 5; k++){
scanf("%d",&arr[k]);
sum += arr[k];
if(k==0){
max=arr[0];
min=arr[0];
}
else{
if(arr[k] > max){
max = arr[k];
}
if(arr[k] < min){
min = arr[k];
}
}
}
printf("sum: %d, max: %d, min: %d\n",sum,max,min);
return 0;
}
ex) charํ 1์ฐจ์ ๋ฐฐ์ด์ ์ ์ธ๊ณผ ๋์์ "Good time" ๋ฌธ์ฅ์ ๋ด์ฉ์ผ๋ก ์ด๊ธฐํ, ์ด๊ธฐํ ์ดํ์๋ ์ ์ฅ๋ ๋ด์ฉ์ ์ถ๋ ฅ
#include <stdio.h>
int main(void) {
char sentence[] = "Good time";
for(int i = 0; i < sizeof(sentence)/sizeof(char); i++){
printf("%c",sentence[i]);
}
printf("\n");
return 0;
}
โฃ charํ ๋ฐฐ์ด
→ ๋ณ์ํํ์ ๋ฌธ์์ด ๋ฐฐ์ด ์ ์ธ์ ๋ง๋ค๋ฉด ๋ฌธ์์ด์ ์ ์ฅ๊ณผ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ
ex) char str[] = "Good morning!";
→ ์์ ๊ฐ์ด ๋ฐฐ์ด์ ๋ง๋ค๋ฉด ๋ฐฐ์ด์ ๊ธธ์ด๋ 14๋ก, ๋ฌธ์์ด์ ๋์๋ '\0'์ด๋ผ๋ ํน์๋ฌธ์(escape sequence)๊ฐ ์๋์ผ๋ก ์ฝ์ ๋๋ค. ๋ฌธ์์ด์ ๋์ ์๋์ผ๋ก ์ฝ์ ๋๋ ๋ฌธ์ '\0'์ ๊ฐ๋ฆฌ์ผ null ๋ฌธ์๋ผ๊ณ ํ๋ค.
ex) ์์
#include <stdio.h>
int main(void) {
char str[] = "Good morning!";
printf("size of an array: %d\n",sizeof(str));
printf("null char: %c\n",str[13]);
printf("null char: %d\n",str[13]);
str[12] = '?';
printf("after revision: %s\n",str);
return 0;
}
→ ์ ์์์ ๊ฐ์ด null์ ์ ์ํ์ผ๋ก ASCII code ๊ฐ์ด 0์ด ๋๋ค. (๊ณต๋ฐฑ๋ฌธ์๋ผ๋ฉด ASCII code๊ฐ 32)
→ null๋ ๊ณต๋ฐฑ๋ฌธ์๋ %c๋ก ํํํ๋ฉด ๋ชจ๋ ๋๊ฐ์ด ํํ๋๊ธฐ์ ์ฃผ์!
ex) ์์ - null๋ฌธ์๊ฐ ์กด์ฌํ๋ ๋ฌธ์์ด๊ณผ, null๋ฌธ์๊ฐ ์กด์ฌํ์ง ์๋ ๋ฌธ์ ๋ฐฐ์ด
#include <stdio.h>
int main(void) {
char sentence1[] = "Good time";
char sentence2[] = {'G','o','o','d',' ','t','i','m','e'};
int sentence1Len, sentence2Len;
sentence1Len = sizeof(sentence1) / sizeof(char);
sentence2Len = sizeof(sentence2) / sizeof(char);
printf("sentence 1's length is: %d, sentence2's length is %d\n",sentence1Len,sentence2Len);
//sentence 1's length is: 10, sentence2's length is 9
printf("\n");
return 0;
}
โค scanf ํจ์์ ์ ๋ ฅ: %s ์์๋ฌธ์ ์ฌ์ฉ
→ ๋ฌธ์์ด์ ์ด์ฉํ scanf๋ &ํ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ํ ๋ฒ scanf๋ฅผ ์ฌ์ฉํ๋ฉด ๊ณต๋ฐฑ ๊ธฐ์ค ๋ฌธ์์ด์ ์ฌ๋ฌ ๊ฐ ๋๋๋ฏ๋ก ์ฒซ๋ฒ์งธ ๋ฌธ์์ด๋ง ์ถ๋ ฅ๋๋ค. scanf๋ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ถ์ง๋ ๊ธฐ์ค์ด ๊ณต๋ฐฑ์ด๋ฏ๋ก, ๋ฌธ์ฅ ์ ์ฒด๋ฅผ ์ ๋ ฅ๋ฐ๊ธฐ์๋ ์ ์ ์น ์๋ค.
→ scanf ํจ์ํธ์ถ์ ํตํด์ ์ ๋ ฅ ๋ฐ์ ๋ฌธ์์ด์ ๋์๋ null ๋ฌธ์๊ฐ ์ฝ์ ๋์ด ์๋ค. (C์ธ์ด์์ ํํํ๋ ๋ชจ๋ ๋ฌธ์์ด์ ๋์๋ null ๋ฌธ์ ์๋ ์ฝ์ )
→ ๋ฐ๋ผ์ ๋ง์ง๋ง์ null ๋ฌธ์๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ๋ฌธ์๋ฐฐ์ด์ด๊ณ , null ๋ฌธ์๊ฐ ์๋ค๋ฉด ๋ฌธ์์ด์ด๋ค.
ex)
#include <stdio.h>
int main(void) {
char str[50];
int idx = 0;
printf("enter the string: ");
scanf("%s", str);
printf("what you entered: %s\n",str);
while(str[idx]!=0){
printf("%c", str[idx]);
idx++;
}
print("\n");
return 0;
}
โฅ null๋ฌธ์
→ ๋ฌธ์์ด ๊ตฌ๋ถ ์ฉ๋
→ char str[100] = " . . . "; ์ฝ๋์์ str[0]์ด ๋ฌธ์์ด์ ์์์์น์ด๋ฉฐ, ๋ฌธ์์ด์ ๋์๋ null ๋ฌธ์ ์ฝ์
→ ๋ฌธ์์ด ๋์ค์ null์ ์ถ๊ฐํ๋ค๋ฉด %s ํํ๋ก printf() ์งํํ ๊ฒฝ์ฐ null๊น์ง์ ํ ๊ฐ์ ๋ฌธ์์ด๋ก ์ธ์ํ๊ณ , ์ธ์ํ ๋ฌธ์์ด๋ง ์ถ๋ ฅ
ex) ํ๋์ ์๋จ์ด๋ฅผ ์ ๋ ฅ๋ฐ๊ณ , ์ ๋ ฅ๋ฐ์ ์๋จ์ด์ ๊ธธ์ด ๊ณ์ฐ
#include <stdio.h>
int main(void) {
char str[100];
int idx = 0, cnt = 0;
printf("enter your word: ");
scanf("%s", str);
while(str[idx]!=0){
cnt++;
idx++;
}
printf("%d\n",cnt);
return 0;
}
ex) ์๋จ์ด ์ ๋ ฅ๋ฐ๊ณ charํ ๋ฐฐ์ด์ ์ ์ฅ, ๋ฐฐ์ด์ ์ ์ฅ๋ ์๋จ์ด๋ฅผ ์ญ์์ผ๋ก ๋ค์ง์. null๋ฌธ์์ ์์น๋ฅผ ๋ณ๊ฒฝํด์๋ ์๋๋ค. ๋ค์ง์ ์๋จ์ด ์ถ๋ ฅํ๊ธฐ
- ํ์ด (1) ๋จผ์ ์ ๋ ฅํ ๋จ์ด์ ๊ธธ์ด๋ฅผ while๋ฌธ์ผ๋ก ์์๋ธ ๋ค, ์ฒซ for๋ฌธ์ผ๋ก ์๋ก์ด ๋ฐฐ์ด์ ๊ฑฐ๊พธ๋ก ์ ์ฅ, ๋ ๋ฒ์งธ for๋ฌธ์ผ๋ก ์๋ก์ด ๋ฐฐ์ด ์ถ๋ ฅ
#include <stdio.h>
int main(void) {
char str[100];
char str2[100];
int length=0, idx;
printf("enter your word: ");
scanf("%s", str);
while(str[length] != 0){
length++;
}
idx = length-1;
for(int j = 0; j < length; j++){
str2[j] = str[idx];
idx--;
}
for(int k = 0; k < length; k++){
printf("%c",str2[k]);
}
printf("\n");
return 0;
}
- ํ์ด (2) while๋ฌธ์ผ๋ก ์๋จ์ด์ ๊ธธ์ด๋ฅผ ํ์ ํ ๋ค, for๋ฌธ์ผ๋ก ์๋จ์ด ๊ธธ์ด์ ์ ๋ฐ๊น์ง ์งํํ๋ฉฐ ์๊ณผ ๋ค๋ฅผ ์๋ก ๋ฐ๊ฟ (temp ๋ณ์ ์ฌ์ฉ)
#include <stdio.h>
int main(void) {
char voca[100];
int len = 0, i;
char temp;
printf("enter your word: ");
scanf("%s",voca);
while(voca[len] != '\0')
len++;
for(int i = 0; i < len/2; i++){
temp = voca[i];
voca[i] = voca[(len-i)-1];
voca[(len-i)-1] = temp;
}
printf("after reversing... %s\n",voca);
return 0;
}
ex) ์๋จ์ด๋ฅผ ์ ๋ ฅ๋ฐ๊ณ , ์ ๋ ฅ๋ฐ์ ์๋จ์ด๋ฅผ ๊ตฌ์ฑํ๋ ๋ฌธ์ ์ค์์ ์์คํค ์ฝ๋์ ๊ฐ์ด ๊ฐ์ฅ ํฐ ๋ฌธ์๋ฅผ ์ฐพ์์ ์ถ๋ ฅ(์๋ฅผ ๋ค์ด LOVE๋ฅผ ์ ๋ ฅํ๋ค๋ฉด V ์ถ๋ ฅ)
#include <stdio.h>
int main(void) {
char word[100];
printf("your word: ");
scanf("%s",word);
char max = 0;
int idx = 0;
while(word[idx] != 0){
if(word[idx] > max){
max = word[idx];
}
idx++;
}
printf("%c\n",max);
return 0;
}
12. ํฌ์ธํฐ์ ์ดํด
โฆ ํฌ์ธํฐ ๋ณ์ - ์ฃผ์ ๊ฐ์ ์ ์ฅ
→ ํฌ์ธํฐ๋ฅผ ์ด์ฉํด์ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค
ex) ์๋์ ์ฝ๋๊ฐ ์๋ค๋ฉด,
#include <stdio.h>
int main(void) {
char ch1 = 'A', ch2 = 'Q';
int num = 7;
return 0;
}
→ char ๋ฐ์ดํฐ ํ์ ์ 1๋ฐ์ดํธ, int ๋ฐ์ดํฐ ํ์ ์ 4๋ฐ์ดํธ๋ก ์ค์ ๋ฉ๋ชจ๋ฆฌ์ ์์ ๊ฐ์ด ๋ฐฐ์น๋์ด ์๋ค. (๊ผญ ์ฐ์์ ์ผ๋ก ๋ฐฐ์น๋์ด ์๋ ๊ฑด x)
→ ์ด ๋, 1 byte ๋ณ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ํ ๋น์ด ๋๋๋ฐ, ๊ฐ byte ๋ณ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ์์ฒด๋ ์ ์์ด๋ฉฐ ํด๋น ์ ์๋ฅผ ๋ณ์๋ก ์ ์ฅํ๊ธฐ ์ํด ๋ง๋ จ๋ ๊ฐ๋ ์ด 'ํฌ์ธํฐ ๋ณ์'
→ ์ด ๋, 1๋ฐ์ดํธ๋ฅผ ๋์ด๊ฐ ๊ฒฝ์ฐ ๋ณ์๊ฐ ์ด๋์ ํ ๋น๋์ด ์๋ ์ง ์๋ ค๋ฉด ์์๋ฒ์ง๋ง์ ๊ฐ์ง๊ณ ์์น๋ฅผ ํํ
ex) ์ intํ ๋ณ์ num์ 0x12ff75๋ฒ์ง์ ํ ๋น๋์ด ์๋ค.
→ ํฌ์ธํฐ ๋ณ์๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ * ํ์๋ฅผ ์ฌ์ฉ
ex) int * pnum;
โซ pnum์ ํฌ์ธํฐ ๋ณ์์ ์ด๋ฆ
โซ int *์ intํ ๋ณ์์ ์ฃผ์ ๊ฐ์ ์ ์ฅํ๋ ํฌ์ธํฐ ๋ณ์๋ฅผ ์ ์ธ
ex) pnum = #
โซ ์ ์์์์ &์ฐ์ฐ์๋ & ์ค๋ฅธ์ชฝ์ ๋ฑ์ฅํ๋ ํผ์ฐ์ฐ์์ ์ฃผ์ ๊ฐ์ ๋ฐํํ๋ ์ฐ์ฐ์์ด๋ค. & ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ก ์ ์์์์๋ num์ ์ฃผ์๊ฐ์ด ๋ฐํ๋๋ฉฐ, ์ด๋ฅผ ํฌ์ธํฐ ๋ณ์ pnum์ ์ ์ฅํ๊ฒ ๋๋ค.
โซ ๋ฐ๋ผ์, ์ ๊ทธ๋ฆผ์ฒ๋ผ pnum์ num์ ์ฃผ์๊ฐ์ด ์ ์ฅ๋๋ค. ์ด๋ฅผ "ํฌ์ธํฐ ๋ณ์ pnum์ด intํ ๋ณ์ num์ ๊ฐ๋ฆฌํจ๋ค"๋ผ๊ณ ํํ
โซ ์ฌ๊ธฐ์ ํฌ์ธํฐ ๋ณ์์ ํฌ๊ธฐ๋ 4byte ๋๋ 8byte ๊ฐ๋ฅํ๋ค. 32bit system์์๋ 4byte, 64bit system์์๋ 8byte๋ก ํํํ๋ค. ๊ฐ bit system์์ ํํํ๋ ์ฃผ์ ๊ฐ์ ํฌ๊ธฐ์ ๋ฐ๋ผ ํฌ์ธํฐ ๋ณ์์ ํฌ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋ค. (๋น์ฐํ ์ฃผ์ ๊ฐ์ ํฌ๊ธฐ = ํฌ์ธํฐ ๋ณ์์ ํฌ๊ธฐ)
โง ํฌ์ธํฐ ๋ณ์์ ์ ์ธ / ํฌ์ธํฐ ํ(Type)
→ type * ptr; ์ฆ, typeํ ๋ณ์์ ์ฃผ์ ๊ฐ์ ์ ์ฅํ๋ ํฌ์ธํฐ ๋ณ์ ptr์ ์ ์ธ
ex) int num = 7; int * pnum = #์์ int * pnum์ ํตํด ์ฐ๋ฆฌ๋ pnum์ด ๊ฐ๋ฆฌํค๋(์ฆ, pnum์ด๋ผ๋ ์ฃผ์๊ฐ์ ๊ฐ์ง๋) ๋ณ์ num์ ์๋ฃํ์ด int์์ ์ ์ ์๋ค.
→ ๋ฐ๋ผ์, ํฌ์ธํฐ ๋ณ์์ ์ ์ธ ํํ๋ง ๋ณด๊ณ ๋, ํฌ์ธํฐ๊ฐ ํ์ฌ ๊ฐ๋ฆฌํค๋ ๋ณ์์ ์๋ฃํ ์ง์ ๊ฐ๋ฅ
→ int *, char *, double * ๋ฑ์ ๊ฐ๋ฆฌ์ผ ํฌ์ธํฐ ํ(type)์ด๋ผ ํ๋ค.
โจ & ์ฐ์ฐ์ / * ์ฐ์ฐ์
→ & ์ฐ์ฐ์๋ ํผ์ฐ์ฐ์์ ์ฃผ์๊ฐ์ ๋ฐํํ๋ ์ฐ์ฐ์. &์ฐ์ฐ์์ ํผ์ฐ์ฐ์๋ ๋ณ์์ฌ์ผ ํ๋ฉฐ, ์์๋ ํผ์ฐ์ฐ์๊ฐ ๋ ์ ์๋ค.
→ * ์ฐ์ฐ์๋ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ ์ฐ์ฐ์. ์ฆ ์๋ฅผ ๋ค์ด *pnum์ด๋ผ๋ฉด pnum์ด๋ผ๋ ํฌ์ธํฐ ๋ณ์๊ฐ ๊ฐ๋ฆฌํค๋ ๋ณ์๋ฅผ ๋ปํ๋ค.
ex) *์ฐ์ฐ์๋ฅผ ์ด์ฉํด์ num ๋ณ์์ ์ ์ฅํ ๊ฐ์ 10์์ 20์ผ๋ก ๋ฐ๊พธ์๋ค.
#include <stdio.h>
int main(void) {
int num = 10;
int *pnum = #
*pnum = 20;
printf("%d\n",num); //20
return 0;
}
ex) pnum intํ ํฌ์ธํฐ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ๋ ๋ณ์ ๊ฐ๊ฐ์ ์ฃผ์๊ฐ ๋์ด ๋ณ์์ ๊ฐ์ ๋ฐ๊พธ์๋ค.
#include <stdio.h>
int main(void) {
int num1 = 100, num2 = 100;
int *pnum;
pnum = &num1;
(*pnum)+=30;
pnum = &num2;
(*pnum)-=30;
printf("num1: %d, num2: %d\n",num1, num2); //num1: 130, num2: 70
return 0;
}
โฉ ๋ค์ํ ํฌ์ธํฐ ํ
→ pnum์ด intํ ๋ณ์๋ผ๋ฉด "pnum์ ์ ์ฅ๋ ์ฃผ์๋ฅผ ์์์ผ๋ก 4byte๋ฅผ ์ฝ์ด ๋ค์ฌ์ ์ด๋ฅผ ์ ์๋ก ํด์"
→ pnum์ด doubleํ ๋ณ์๋ผ๋ฉด "pnum์ ์ ์ฅ๋ ์ฃผ์๋ฅผ ์์์ผ๋ก 8byte๋ฅผ ์ฝ์ด ๋ค์ฌ์ ์ด๋ฅผ ์ค์๋ก ํด์"
→ ์ด๋ ๊ฒ ํฌ์ธํฐ ํ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐธ์กฐํ๋ ๊ธฐ์ค์ด ๋๋ค. ํฌ์ธํฐ ํ์ ์ ์ํ ์ด์ ๋ * ์ฐ์ฐ์๋ฅผ ํตํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ๊ทผ ๊ธฐ์ค ๋ง๋ จ.
→ ์ฆ * ์ฐ์ฐ์ ์์ ํฌ์ธํฐ์ ํ์ ๋ง๋ค์ด์, ํฌ์ธํฐ๋ก ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ํ ๋, ํด๋น ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ๊ณต๊ฐ์ ์ฐธ์กฐํ ์ ์๋ค.
ex) ํ ๊ฐ์ ๋ณ์๋ฅผ ๋์์ ํฌ์ธํฐ๋ก ๊ฐ๋ฆฌํค๋ ์์
#include <stdio.h>
int main(void) {
int num = 10;
int * ptr1 = #
int * ptr2 = ptr1;
(*ptr1)++;
(*ptr2)++;
printf("%d\n",num); //12
return 0;
}
ex) intํ ๋ณ์ num1๊ณผ num2๋ฅผ ์ ์ธ๊ณผ ๋์์ ๊ฐ๊ฐ 10๊ณผ 20์ผ๋ก ์ด๊ธฐํํ๊ณ , intํ ํฌ์ธํฐ ๋ณ์ ptr1๊ณผ ptr2๋ฅผ ์ ์ธํ์ฌ ๊ฐ๊ฐ num1๊ณผ num2๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํ์. ๊ทธ๋ฆฌ๊ณ ์ด ์ํ์์ ํฌ์ธํฐ ๋ณ์ ptr1๊ณผ ptr2๋ฅผ ์ด์ฉํด์ num1์ ๊ฐ์ 10 ์ฆ๊ฐ์ํค๊ณ , num2์ ๊ฐ์ 10 ๊ฐ์์ํค์. ์ด์ ๋ ํฌ์ธํฐ ๋ณ์ ptr1๊ณผ ptr2๊ฐ ๊ฐ๋ฆฌํค๋ ๋์์ ์๋ก ๋ฐ๊พธ์. ์ฆ ํฌ์ธํฐ ๋ณ์ ptr1์ด num2๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํ๊ณ , ํฌ์ธํฐ ๋ณ์ ptr2๊ฐ num1์ ๊ฐ๋ฆฌํค๊ฒ ํ์. ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ptr1๊ณผ ptr2๊ฐ ๊ฐ๋ฆฌํค๋ ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ ์ถ๋ ฅํ์.
#include <stdio.h>
int main(void) {
int num1 = 10, num2 = 20;
int * ptr1 = &num1;
int * ptr2 = &num2;
(*ptr1)+=10; // num1 20
(*ptr2)-=10; // num2 10
int *temp;
temp = ptr2;
ptr2 = ptr1;
ptr1 = temp;
printf("ptr1 points to %d, ptr2 points to %d\n",*ptr1, *ptr2);
printf("num1: %d, num2: %d\n",num1, num2);
return 0;
}
/*
ptr1 points to 10, ptr2 points to 20
num1: 20, num2: 10
*/
โช ์๋ชป๋ ํฌ์ธํฐ์ ์ฌ์ฉ
#include <stdio.h>
int main(void) {
//(1)
int *ptr;
*ptr = 200;
//(2)
int *ptr2 = 125;
*ptr2 = 10;
return 0;
}
(1) ํฌ์ธํฐ ๋ณ์๋ฅผ ์ ์ธ๋ง ํ์ง๋ง, ptr์ด ๊ฐ๋ฆฌํค๋ ์์น๋ฅผ ์ง์ ํ์ง ์์๋ค. ์ด ๋ ๋ฉ๋ชจ๋ฆฌ ์ด๋๊ฐ์ 200์ผ๋ก ๋ฐ๊พธ์ด์ผ ํ๋๋ฐ, ์ปดํจํฐ ์ ์ฅ์์๋ ๋ชจ๋ฅธ๋ค.
(2) ํฌ์ธํฐ ๋ณ์๋ฅผ ์ญ์ ์ ์ธ๋ง ํ์ง๋ง, 125๊ฐ ์ด๋์ธ์ง ๋ชจ๋ฅด๋ฏ๋ก ์ญ์ ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ๋ชจ๋ฅธ๋ค.
→ ํฌ์ธํฐ ๋ณ์๋ฅผ ์ ์ธ๋ง ํด๋๊ณ ์ดํ์ ์ ํจํ ์ฃผ์ ๊ฐ์ ์ฑ์ ๋ฃ๋ ๋ค๋ฉด ์ด๊ธฐํ๋ฅผ ์๋์ ๊ฐ์ด ํ๋ค. ์ด๋ฅผ null pointer๋ผ๊ณ ํ๋ฉฐ, ํฌ์ธํฐ ๋ณ์๋ฅผ ๋ง๋ค๊ธฐ๋ ํ์ง๋ง, ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํน์ ๊ณต๊ฐ ์ด๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฑด ์๋๋ค. ํฌ์ธํฐ ๋ณ์๊ฐ ์์ง ์๋ฌด๋ฐ๋ ๊ฐ๋ฆฌํค์ง ์๋๋ค.
#include <stdio.h>
int main(void) {
int *ptr1 = 0;
int *ptr2 = NULL;
return 0;
}
13. ํฌ์ธํฐ์ ๋ฐฐ์ด! ํจ๊ป ์ดํดํ๊ธฐ
โซ ๋ฐฐ์ด์ ์ด๋ฆ = ํฌ์ธํฐ
→ ์์ ๋ฐฐ์ด ํฌ์ธํฐ๋ ๋ณ์ ํํ์ ํฌ์ธํฐ ์๋ค๋ฉด, ๋ฐฐ์ด์ ์ด๋ฆ์ ์์ ํํ์ ํฌ์ธํฐ์ด๋ค. ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ ํฌ์ธํฐ
→ %p conversion specifier๋ก ๋ณ์์ ์ฌ๋ฌ ํฌ์ธํฐ๋ฅผ ์ดํด๋ณด์๋ฉด,
#include <stdio.h>
int main(void) {
int arr[3] = {0, 1, 2};
printf("name of the array: %p\n",arr);
printf("first element: %p\n", &arr[0]);
printf("second element: %p\n", &arr[1]);
printf("third element: %p\n",&arr[2]);
return 0;
}
/*
name of the array: 0x7ffe7b9854a0
first element: 0x7ffe7b9854a0
second element: 0x7ffe7b9854a4
third element: 0x7ffe7b9854a8
*/
→ ๋ฐฐ์ด์ ์ด๋ฆ ์์ฒด๊ฐ ๋ฐฐ์ด์ ํฌ์ธํฐ๊ฐ ๋๊ณ , ์ฆ ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์์์ ์ฃผ์์ด๋ฉฐ, '๊ฐ์ ์ ์ฅ์ด ๋ถ๊ฐ๋ฅํ ์์'๋ผ๋๊ฑธ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ก ์ ์ ์๋ค.
→ ๋ํ, intํ ๋ฐฐ์ด์์๊ฐ ์ฃผ์ ๊ฐ์ ์ฐจ๋ 4๋ฐ์ดํธ์์ ์ ์ ์๊ณ , ์ด๋ ๊ณง '๋ชจ๋ ๋ฐฐ์ด ์์๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋๋ํ ํ ๋น๋๋ค' ์ฆ๋ช ๊ฐ๋ฅ
* ์์ ๋ฐฐ์ด ๋ณ์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ '๋ณ์ ํํ์ ํฌ์ธํฐ'๋ก ๋ค๋ฅธ ๋ณ์๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์์ง๋ง, ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ '์์ ํํ์ ํฌ์ธํฐ'๋ก ๋ค๋ฅธ ๋ฐฐ์ด์ ๊ฐ๋ฆฌํฌ ์ ์๋ค. (์์์ด๋ฏ๋ก ๋ฐ๊พธ๊ธฐ ๋ถ๊ฐ๋ฅ!)
ex) int arr1[5]; ๋ผ๋ฉด, ๋ฐฐ์ด์ ์ด๋ฆ arr1์ด ๊ฐ๋ฆฌํค๋ ๊ฒ์ ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์์์ด๋ฉฐ, ์ด๋ intํ ๋ณ์์ด๋ค. ๋ฐ๋ผ์ arr1์ intํ ํฌ์ธํฐ(int *)๋ผ๋ ๊ฒฐ๋ก ์ด ๋์จ๋ค.
→ ์ฆ 1์ฐจ์ ๋ฐฐ์ด์ ํฌ์ธํฐ ํ์ ๋ฐฐ์ด์ ์ด๋ฆ์ด ๊ฐ๋ฆฌํค๋ ๋์์ ๊ธฐ์ค์ผ๋ก ๊ฒฐ์ ํ๋ค (๋ณ์ ํํ์ ํฌ์ธํฐ์ ๋์ผ!)
ex) ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๋ ์์ ํํ์ ํฌ์ธํฐ → * ์ฐ์ฐ
→ ์๋ ์์๋ฅผ ํตํด ๋ฐฐ์ด ์ด๋ฆ ์์ฒด๊ฐ ๋ฐฐ์ด์ ํฌ์ธํฐ์ด๋ฏ๋ก ๋ฐฐ์ด ์ด๋ฆ์ ์ฌ์ฉํด ๊ฐ ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์์๋ฅผ ๋ฐ๊พธ์๋ค.
#include <stdio.h>
int main(void) {
int arr1[3] = {1,2,3};
double arr2[3] = {1.1, 2.2, 3.3};
printf("%d %g\n",*arr1, *arr2); // 1 1.1
*arr1 += 100;
*arr2 += 120.5;
printf("%d %g\n",arr1[0], arr2[0]); // 101 121.6
return 0;
}
→ ์ฆ, ์์ ์ธ๊ธํ ๋ฐฐ์ด ์ด๋ฆ arr์ ์ฌ์ฉํด arr[0], arr[1], arr[2] arr[2] ๋ชจ๋ arr์ด๋ผ๋ ๋ฐฐ์ด ์ด๋ฆ์ ํฌ์ธํฐ๋ฅผ ์ด์ฉํด ๋ฐฐ์ด์ ์ ๊ทผํ์ฌ ๊ฐ๊ฐ์ ๋ฐฐ์ด ๋ด์ ์์๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์๋ ๊ฒ์ด๋ค. ํ ๋ฒ ๋ ์๊ฐํด๋ณด๋ฉด, ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์์ ์ฃผ์๋ฅผ ptr ํฌ์ธํฐ ๋ณ์์ ๋ฐ๋ก ์ ์ฅํด ptr ํฌ์ธํฐ ๋ณ์๋ก๋ arr์ฒ๋ผ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค๋ ์ ์ด๋ค! ์๋ ์์ ํ์ธํด๋ณด์
ex) ๋ฐฐ์ด ์ด๋ฆ arr์ฒ๋ผ ptr ๋ณ์๋ก ๋ฐฐ์ด ์์๋ค ์ ๊ทผํด๋ณด๊ธฐ
#include <stdio.h>
int main(void) {
int arr[3] = {15, 25, 35};
int *ptr = &arr[0];
printf("%d %d\n", ptr[0], arr[0]); // 15 15
printf("%d %d\n", ptr[1], arr[1]); // 25 25
printf("%d %d\n", ptr[2], arr[2]); // 35 35
printf("%d %d\n", *ptr, *arr); // 15 15
return 0;
}
โฌ ํฌ์ธํฐ ์ฐ์ฐ
→ ํฌ์ธํฐ ๋ณ์๋ฅผ ๋์์ผ๋ก ๋ค์ํ ํํ์ ์ฆ๊ฐ ๋ฐ ๊ฐ์์ฐ์ฐ์ ์งํํ ์ ์๋ค.
ex) int* ํ๊ณผ double* ํ ํฌ์ธํฐ ๋ณ์์ ์ฐ์ ์ฐ์ฐ ๊ฒฐ๊ณผ ์์ ๋ฅผ ์๋ ์ดํด๋ณด๋ฉด
#include <stdio.h>
int main(void) {
int *ptr1 = 0x0010;
double *ptr2 = 0x0010;
printf("%p %p\n",ptr1+1, ptr1+2);
printf("%p %p\n",ptr2+1, ptr2+2);
printf("%p %p\n",ptr1,ptr2);
ptr1++;
ptr2++;
printf("%p %p\n",ptr1,ptr2);
return 0;
}
: ++๊ฐ ์งํ๋ ๋๋ง๋ค intํ ํฌ์ธํฐ์ ์ ์ฅ๋ ์ฃผ์๊ฐ์ 4์ฉ ์ฆ๊ฐํ๊ณ , doubleํ ํฌ์ธํฐ์ ์ ์ฅ๋ ์ฃผ์๊ฐ์ 8์ฉ ์ฆ๊ฐํ๋ค.
→ ๋ฐ๋ผ์ intํ ํฌ์ธํฐ๋ฅผ ๋์์ผ๋ก n ์ฆ๊ฐํ๋ฉด nxsizeof(int)์ ํฌ๊ธฐ๋งํผ ์ฆ๊ฐํ๊ณ , doubleํ ํฌ์ธํฐ๋ฅผ ๋์์ผ๋ก n ์ฆ๊ฐํ๋ฉด nxsizeof(double)์ ํฌ๊ธฐ๋งํผ ์ฆ๊ฐํ๋ค. (๊ฐ์๋ ๋ง์ฐฌ๊ฐ์ง)
ex) ptr ํฌ์ธํฐ์ ์ฆ๊ฐ์ฐ์ฐ์ / ๊ฐ์์ฐ์ฐ์์ ๋ฐ๋ผ ๊ฐ๋ฆฌํค๋ ์ฃผ์ด์ง ๋ฐฐ์ด์ ์์๊ฐ ๊ณ์ ๋ฐ๋์ ์๋๋ก ํ์ธํ ์ ์๋ค!
#include <stdio.h>
int main(void) {
int arr[3] = {11, 22, 33};
int *ptr = arr;
printf("%d, %d, %d\n",*ptr, *(ptr+1), *(ptr+2)); // 11, 22, 33
printf("%d ",*ptr); ptr++;
printf("%d ",*ptr); ptr++;
printf("%d ",*ptr); ptr--;
printf("%d ",*ptr); ptr--;
printf("%d ",*ptr); printf("\n"); // 11 22 33 22 11
return 0;
}
→ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด int * ํ ํฌ์ธํฐ๋ผ๋ฉด + 1 ์ฉ ์ฆ๊ฐํ ๋๋ง๋ค ์ค์ ๋ก๋ int๊ฐ 4byte์ด๋ฏ๋ก ์ฃผ์๊ฐ์ด 4(10์ง๋ฒ)์ฉ ์ฆ๊ฐํ๋ค. (๊ทธ ๋ค์ ์์๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ ์ํด์) / ๋๊ฐ์ ๋ฐฉ์์ผ๋ก double *ํ ํฌ์ธํฐ๋ผ๋ฉด ์ฃผ์๊ฐ์ด 8(10์ง๋ฒ)์ฉ ์ฆ๊ฐํ๋ค
(+) *(++ptr) = 20;์ด๋ *(ptr+1) = 20; ๋ชจ๋ ํ์ฌ ptr์ด ๊ฐ๋ฆฌํค๋ ์์น์์ 4๋ฐ์ดํธ ๋จ์ด์ง ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ 20์ ์ ์ฅํ๋ ์ฝ๋(int * ํ ํฌ์ธํฐ) ํ์ง๋ง ptr+1์ ๊ฒฝ์ฐ ptr ๊ฐ ์์ฒด๊ฐ ๋ฐ๋์ง๋ ์๋๋ค๋ ์ฐจ์ด๋ง ์๋ค.
→ ๋ฐ๋ผ์ arr[i]์ *(arr+i)์ ๊ฐ๋ค๊ณ ๋งํ ์ ์๋ค.
ex) ๊ธธ์ด๊ฐ 5์ธ intํ ๋ฐฐ์ด์ 1, 2, 3, 4, 5๋ก ์ด๊ธฐํ. ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ ๋ณ์ ptr ์ ์ธ. ํฌ์ธํฐ ๋ณ์ ptr์ ์ ์ฅ๋ ๊ฐ์ ์ฆ๊ฐ์ํค๋ ํํ์ ์ฐ์ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐฐ์ด์์์ ์ ๊ทผํ๋ฉด์ ๋ชจ๋ ๋ฐฐ์ด์์์ ๊ฐ์ 2์ฉ ์ฆ๊ฐ์ํค๊ณ , ํ์ธ
#include <stdio.h>
int main(void) {
int arr[5] = {1,2,3,4,5};
int * ptr = arr;
for(int i = 0; i < 5; i++){
(*ptr) += 2;
ptr++;
}
for(int j = 0; j < 5; j++){
printf("%d ", arr[j]);
}
printf("\n");
return 0;
}
ex) ์ ์์ ์์ ํฌ์ธํฐ ๋ณ์ ptr์ ์ ์ฅ๋ ๊ฐ์ ๋ณ๊ฒฝ์ํค์ง ์๊ณ , ptr์ ๋์์ผ๋ก ๋ง์ ์ฐ์ฐ์ ํ์ฌ, ๊ทธ ๊ฒฐ๊ณผ๋ก ๋ฐํ๋๋ ์ฃผ์ ๊ฐ์ ํตํด์ ๋ชจ๋ ๋ฐฐ์ด์์์ ์ ๊ทผํ์ฌ ๊ฐ์ 2์ฉ ์ฆ๊ฐ
#include <stdio.h>
int main(void) {
int arr[5] = {1,2,3,4,5};
int * ptr = arr;
for(int i = 0; i < 5; i++){
*(ptr+i) += 2;
}
for(int j = 0; j < 5; j++){
printf("%d ", arr[j]);
}
printf("\n");
return 0;
}
ex) ์ ๋ฐฐ์ด์ ๋ง์ง๋ง ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ ๋ณ์ ptr ์ ์ธ. ๊ทธ ๋ค์, ํฌ์ธํฐ ๋ณ์ ptr์ ์ ์ฅ๋ ๊ฐ์ ๊ฐ์์ํค๋ ํํ์ ์ฐ์ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ ๋ฐฐ์ด์์์ ์ ๊ทผํ์ฌ ๋ฐฐ์ด์ ์ ์ฅ๋ ๋ชจ๋ ์ ์๋ฅผ ๋ํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ธฐ
#include <stdio.h>
int main(void) {
int arr[5] = {1,2,3,4,5};
int * ptr = &arr[4];
int ans = 0;
for(int i = 0; i < 5; i++){
ans += *ptr;
ptr--;
}
printf("%d", ans);
printf("\n"); //15
return 0;
}
ex) ๊ธธ์ด๊ฐ 6์ธ intํ ๋ฐฐ์ด arr ์ ์ธํ๊ณ 1, 2, 3, 4, 5, 6์ผ๋ก ์ด๊ธฐํํ ๋ค์, ๋ฐฐ์ด์ ์ ์ฅ๋ ๊ฐ์ ์์๊ฐ 6, 5, 4, 3, 2, 1์ด ๋๋๋ก ๋ณ๊ฒฝ. ๋จ, ๋ฐฐ์ด์ ์๊ณผ ๋ค๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ ๋ณ์ ๋ ๊ฐ๋ฅผ ์ ์ธํด์ ์ด๋ฅผ ํ์ฉํ์ฌ ์ ์ฅ๋ ๊ฐ์ ์์๋ฅผ ๋ค๋ฐ๊พธ๊ธฐ.
#include <stdio.h>
int main(void) {
int arr[6] = {1,2,3,4,5,6};
int *ptr1 = arr;
int *ptr2 = &arr[5];
int length = sizeof(arr)/sizeof(int);
for(int i = 0; i < length/2 ; i++){
int temp;
temp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = temp;
ptr1++;
ptr2--;
}
for(int j = 0; j < length; j++){
printf("%d ",arr[j]);
}
printf("\n");
return 0;
}
// 6 5 4 3 2 1
โญ ์์ ํํ/ ๋ณ์ ํํ์ ๋ฌธ์์ด์ ๊ฐ๋ฆฌํค๋ ์์ ํํ/ ๋ณ์ ํํ์ ํฌ์ธํฐ
(1) char str1[] = "My String";
(2) char *str2 = "My String";
→ (1)์ ๋ณ์ ํํ์ ๋ฌธ์์ด์ ๊ฐ๋ฆฌํค๋ ์์ํํ์ ํฌ์ธํฐ์ด๋ค. ์์ํํ์ ํฌ์ธํฐ๋ ์ ๋ฐฐ์ด์ ์ด๋ฆ์ผ๋ก str1์ ๋ปํ๋ฏ๋ก, str1 ์์ฒด๋ ๊ณ์ ๋ฌธ์ M์ ๊ฐ๋ฆฌํค๊ณ ๋ง ์๋ ํฌ์ธํฐ ๋ณ์์ด๋ค. ํ์ง๋ง str1์ด ๊ฐ๋ฆฌํค๋ ๋ด์ฉ์ str1[0] = 'K' ์ฝ๋๋ฅผ ํตํด ์ผ๋ง๋ ์ง ๋ณ๊ฒฝํ ์ ์๋ค.
→ (2) ์์ ํํ์ ๋ฌธ์์ด์ ๊ฐ๋ฆฌํค๋ ๋ณ์ํํ์ ํฌ์ธํฐ์ด๋ค. ๋ณ์ํํ์ ํฌ์ธํฐ์ด๋ฏ๋ก ์ str2๋ ๋ฌธ์ M๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋ฌธ์๋ ์ผ๋ง๋ ์ง ๊ฐ๋ฆฌํฌ ์ ์๋ค.
→ (1)(2) ๋ชจ๋ ๋ฌธ์์ด์ ์ฒซ๋ฒ์งธ ๋ฌธ์ M์ ๊ฐ๋ฆฌํจ๋ค๋ ๊ณตํต์ ์ด ์๋ค.
ex) str2๊ฐ ๋ค๋ฅธ ๋ฌธ์์ด์ ๊ฐ๋ฆฌํค๊ฒ ํ ์ ์๊ณ / str1๋ง ๊ฐ๋ฆฌํค๋ ๋ฌธ์์ด์ ์ฒซ๋ฒ์งธ ์์๋ฅผ ๋ฐ๊ฟ ์ ์๋ค.
#include <stdio.h>
int main(void) {
char str1[] = "My String";
char *str2 = "My String";
printf("%s, %s\n",str1, str2);
str2 = "Your String";
printf("%s, %s\n",str1, str2);
str1[0] = 'W';
str2[0] = 'W';
printf("%s, %s\n",str1, str2);
return 0;
}
→ ํฐ ๋ฐ์ดํ๋ก ๋ฌถ์ฌ์ ํํ๋๋ ๋ฌธ์์ด(์์ ํํ์ ๋ฌธ์์ด)์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฅ๋ ํ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๊ฐ์ด ๋ฐํ๋๋ค. ๋ฐ๋ผ์ ์๋ฅผ ๋ค์ด printf()์์ ์์ ํํ์ ๋ฌธ์์ด์ ๋ฃ์์ ๊ฒฝ์ฐ printf() ํจ์๋ ์ ํํ ๋งํ๋ฉด ๋ฌธ์์ด์ ํต์งธ๋ก ์ ๋ฌ๋ฐ์ง ์๊ณ , ๋ฌธ์์ด์ ์ฃผ์๊ฐ์ ์ ๋ฌ๋ฐ๋ ํจ์์ด๋ค. ๋ฐ๋ผ์ printf()์ ์ค์ ๋ก ์ ๋ฌ๋๋ ๊ฐ์ ๋ฌธ์์ด์ ์ฒซ๋ฒ์งธ ๋ฌธ์ ์ฃผ์๊ฐ ์ ๋ฌ๋๋ค.
โฎ ํฌ์ธํฐ ๋ฐฐ์ด
→ ํฌ์ธํฐ ๋ฐฐ์ด์ ๋ง ๊ทธ๋๋ก ํฌ์ธํฐ ๋ณ์๋ก ์ด๋ฃจ์ด์ง, ์ฃผ์ ๊ฐ์ ์ ์ฅ์ ํ ๋ฒ์ ํ ์ ์๋ ๋ฐฐ์ด์ ๋ปํ๋ค.
ex) int ํฌ์ธํฐ๋ฅผ ์ ์ฅํ ํฌ์ธํฐ ๋ฐฐ์ด
#include <stdio.h>
int main(void) {
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;
}
ex) ๋ฌธ์์ด์ ์ ์ฅํ๋ ํฌ์ธํฐ ๋ฐฐ์ด
: ๋ฌธ์์ด ์ฃผ์๋ฅผ ์ ์ฅํ๋ strArr ํฌ์ธํฐ ๋ฐฐ์ด์๋ ๊ฐ๊ฐ์ ๋ฌธ์์ด์ด ๋ค์ด๊ฐ๋๊ฒ ์๋๋ผ, ๋ฌธ์์ด์ด ๋ค์ด๊ฐ๋ฉด ์๋์ผ๋ก ๋ฌธ์์ด์ ์ฃผ์๊ฐ ๊ฐ๊ฐ ์์๋ก์จ ์ ์ฅ์ด ๋๋ค๊ณ ํ ์ ์๋ค.
#include <stdio.h>
int main(void) {
char *strArr[3] = {"Simple", "String", "Array"};
printf("%s\n",strArr[0]);
printf("%s\n",strArr[1]);
printf("%s\n",strArr[2]);
return 0;
}
/*
Simple
String
Array
*/
14. ํฌ์ธํฐ์ ํจ์์ ๋ํ ์ดํด
โฏ ์ธ์์ ๋ฌ์ ๊ธฐ๋ณธ๋ฐฉ์์ ๊ฐ์ ๋ณต์ฌ
→ ํจ์ํธ์ถ ์ ์ ๋ฌ๋๋ ์ธ์์ ๊ฐ์ ๋งค๊ฐ๋ณ์์ ๋ณต์ฌ๊ฐ ๋๋ค. ์ฆ, ํจ์๊ฐ ํธ์ถ๋ ๋ ์ค์ ๋ก ์ ๋ฌ๋๋ ์ธ์๋ ๋งค๊ฐ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ด๋ค.
ex) int SimpleFunc(int num) { } / SimpleFunc(age)
→ ์ ์ฝ๋๊ฐ ์๋ค๋ฉด age์์ฒด๊ฐ SimpleFunc()์ ์ ๋ฌ๋๋ ๊ฒ์ด ์๋๋ผ, age์ ์ ์ฅ๋ ๊ฐ์ด ์ ๋ฌ๋์ด ๋งค๊ฐ๋ณ์ num์ ๋ณต์ฌ๋๋ค.
โฐ ๋ฐฐ์ด์ ํจ์์ ์ธ์๋ก ์ ๋ฌ
→ ๋ฐฐ์ด์ ๊ฒฝ์ฐ ๋ฐฐ์ด ์ ์ฒด๋ฅผ ํจ์ ์ธ์๋ก ์ ๋ฌํ ์ ์๊ณ , ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๋ฐฐ์ด์ ์์น์ธ ์ฃผ์๋ฅผ ์ธ์๋ก ์ ๋ฌํด์ ์ด๋ฅผ ํตํด์ ์ ๊ทผํ๋๋ก ์ ๋ํ ์ ์๋ค.
ex) ShowArayElem()์ด๋ผ๋ ํจ์๋ฅผ ๋ง๋ค๊ณ ์ธ์๋ก param ๋ฐฐ์ด ๋ณ์ ํํ์ ํฌ์ธํฐ๋ฅผ ๊ฐ์ ธ์ ๋ฐฐ์ด์ ์์๋ฅผ ํจ์ ๋ด์์ ์ถ๋ ฅ
#include <stdio.h>
void ShowArayElem(int *param, int len){
int i;
for(i=0;i<len;i++)
printf("%d ",param[i]);
printf("\n");
}
int main(void) {
int arr1[3] = {1,2,3};
int arr2[5] = {4, 5, 6, 7, 8};
ShowArayElem(arr1, sizeof(arr1)/sizeof(int));
ShowArayElem(arr2, sizeof(arr2)/sizeof(int));
return 0;
}
ex) ํจ์๋ฅผ ์ถ๊ฐ๋ก ๋ง๋ค์ด์ ๋ฐฐ์ด์ ์ ์ฅ๋ ์์๋ฅผ ์ฐจ๋ก๋๋ก ๊ฐ์ ํฌ๊ธฐ๋ฅผ ๋๋ฆด ์ ์๋ค.
#include <stdio.h>
void ShowArayElem(int *param, int len){
int i;
for(i=0;i<len;i++)
printf("%d ",param[i]);
printf("\n");
}
void AddArayElem(int *param, int len, int add){
int i;
for(i=0;i<len;i++)
param[i] += add;
}
int main(void) {
int arr[3] = {1,2,3};
AddArayElem(arr, sizeof(arr)/sizeof(int), 1);
ShowArayElem(arr, sizeof(arr)/sizeof(int));
AddArayElem(arr, sizeof(arr)/sizeof(int), 2);
ShowArayElem(arr, sizeof(arr)/sizeof(int));
AddArayElem(arr, sizeof(arr)/sizeof(int), 3);
ShowArayElem(arr, sizeof(arr)/sizeof(int));
return 0;
}
/*
2 3 4
4 5 6
7 8 9
*/
→ ๋ฐ๋ผ์ ๋ฐฐ์ด์ ์ฃผ์ ๊ฐ๋ง ์๋ค๋ฉด ์ด๋์๋ ๋ฐฐ์ด์ ์ ๊ทผํ์ฌ ์ ์ฅ๋ ๊ฐ์ ์ฐธ์กฐํ๊ณ ๋ฐฐ์ด์ ์์๋ฅผ ์ง์ ๋ณ๊ฒฝํ ์๋ ์๋ค.
→ ์ถ๊ฐ๋ก ๋งค๊ฐ๋ณ์๋ก ๋ฐฐ์ด์ ํฌ์ธํฐ๋ฅผ ์ ๋ฌํ ๋, int *param์ ์ธ์๋ก ์ค์ ํ๊ธฐ๋ ํ์ง๋ง, ํํ์ผ๋ก int param[]๋ ๊ฐ๋ฅํ๋ค! ์์ ํ ๋์ผํ ์ ์ธ์ด๋ ํ์ int param[]์ ๋ ๋ง์ด ์ฌ์ฉํ๋ฏ๋ก ๊ธฐ์ตํ๊ธฐ(์ธ์ ์ ๋ฌ์๋ง ๊ฐ๋ฅํ ํํ)
โฑ Call-by-value & Call-by-reference
(1) Call-by-value: ๊ฐ์ ์ ๋ฌํ๋ ํํ์ ํจ์ํธ์ถ
ex) Swap ์์ - ๊ฐ์ ์ ๋ฌํ ๋ ํจ์์ ๊ฐ ์์ฒด๊ฐ ์ ๋ฌ๋ ๋ฟ ์๋ ๋ณ์๊ฐ ์ ๋ฌ๋์ง ์์ผ๋ฏ๋ก ์๋ ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ ์๋ฐ๋
#include <stdio.h>
void Swap(int n1, int n2){
int temp = n1;
n1 = n2;
n2 = temp;
printf("%d, %d\n",n1, n2);
}
int main(void) {
int num1 = 10, num2 = 20;
printf("Before Swap: %d, %d\n",num1, num2);
Swap(num1, num2);
printf("After Swap: %d, %d\n",num1, num2);
return 0;
}
/*
Before Swap: 10, 20
20, 10
After Swap: 10, 20
*/
(2) Call-by-reference: ์ฃผ์ ๊ฐ์ ์ ๋ฌํ๋ ํํ์ ํจ์ํธ์ถ
→ ๋ฐ๋ผ์, ์ง์ ์ฃผ์๊ฐ์ ์ด์ฉํด์ ์ ๊ทผํ๋ค๋ฉด ์ฃผ์๋ก ์ ๊ทผํ๊ธฐ์ ์ค์ num1๊ณผ num2 ๋ณ์๋ก ์ ๊ทผํ๋ฏ๋ก Swap ๊ฐ๋ฅ
ex) call-by-reference๋ฅผ ์ด์ฉํด ์ฃผ์๊ฐ์ผ๋ก ์ค์ swap์ด ๋ ์์
#include <stdio.h>
void Swap(int *ptr1, int *ptr2){
int temp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = temp;
}
int main(void) {
int num1 = 10, num2 = 20;
printf("Before Swap: %d, %d\n",num1, num2);
Swap(&num1, &num2);
printf("After Swap: %d, %d\n",num1, num2);
return 0;
}
/*
Before Swap: 10, 20
After Swap: 20, 10
*/
→ ๋ฐ๋ผ์ scanf ํจ์๋ call-by-reference ํํ์ ํจ์ํธ์ถ๋ก, ๊ฐ์ ์ ๋ ฅ๋ฐ์์ ๋ณ์์ ๊ทธ ๊ฐ์ ์ฑ์ฐ๋ ๊ธฐ๋ฅ์ ํ๋ค. ์ด ๋ ์ฃผ์๊ฐ์ ์ ๋ ฅํด์ผ scanf์ ์ ์ฅ์์ ์ด๋ ๋ณ์์ ์ฑ์ธ ์ง, ๋ฉ๋ชจ๋ฆฌ์ ์์น๋ฅผ ์๊ฒ ๋๋ฏ๋ก ํจ์์ & ์ฃผ์๋ฅผ ๋ฐ๋์ ์ฑ์ด๋ค. / ๋ฌธ์์ด์ ๊ฒฝ์ฐ & ์ฐ์ฐ์๋ฅผ ๋ถ์ด์ง ์๊ณ scanf์ ์ ๋ฌํ๋ค. ๋ฌธ์์ด์ด ์ ์ฅ๋ ๋ฐฐ์ด์ ์ฃผ์๊ฐ ๋ฌธ์์ด ์ด๋ฆ ์์ฒด์ด๋ฏ๋ก &๊ฐ ํ์ x
ex) ๋ณ์ num์ ์ ์ฅ๋ ๊ฐ์ ์ ๊ณฑ์ ๊ณ์ฐํ๋ ํจ์๋ฅผ ์ ์ํ๊ณ , ์ด๋ฅผ ํธ์ถํ๋ main ํจ์ ์์ฑ. ๋จ ์๋ ๋๊ฐ์ง ํํ๋ก ํจ์๋ฅผ ์ ์ํด์ผ ํจ
→ Call-by-value ๊ธฐ๋ฐ์ SquareByValue ํจ์
→ Call-by-reference ๊ธฐ๋ฐ์ SquareByReference ํจ์
SquareByValue ํจ์๋ ์ธ์๋ก ์ ๋ฌ๋ ๊ฐ์ ์ ๊ณฑ์ ๋ฐํํด์ผ ํ๋ฉฐ, SquareByReference ํจ์๋ ์ ์๊ฐ ์ ์ฅ๋์ด ์๋ ๋ณ์์ ์ฃผ์ ๊ฐ์ ์ธ์๋ก ๋ฐ์์ ํด๋น ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ ์ ๊ณฑ์ ๊ทธ ๋ณ์์ ๋ค์ ์ ์ฅํด์ผ ํ๋ค.
#include <stdio.h>
int SquareByValue(int n){
return n*n;
}
void SquareByReference(int *ptr){
(*ptr) = (*ptr)*(*ptr);
}
int main(void) {
int num;
printf("Enter num: ");
scanf("%d",&num);
printf("After Call-by-value: %d\n",SquareByValue(num));
SquareByReference(&num);
printf("After Call-by-reference: %d\n",num);
return 0;
}
ex) ์ธ ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ ์๋ก ๋ค๋ฐ๊พธ๋ ํจ์. ํจ์์ ์ด๋ฆ์ด Swap3๋ผ๋ฉด Swap3(&num1, &num2, &num3); ํํ๋ก ํธ์ถ๋์ด์ผ ํ๋ค. ํจ์ํธ์ถ์ ๊ฒฐ๊ณผ๋ก num1์ ์ ์ฅ๋ ๊ฐ์ num2์, num2์ ์ ์ฅ๋ ๊ฐ์ num3์, num3์ ์ ์ฅ๋ ๊ฐ์ num1์ ์ ์ฅ๋์ด์ผ ํ๋ค.
#include <stdio.h>
void Swap3(int *ptr1, int *ptr2, int *ptr3){
int temp;
temp = *ptr3;
*ptr3 = *ptr2;
*ptr2 = *ptr1;
*ptr1 = temp;
}
int main(void) {
int num1, num2, num3;
printf("Enter three nums: ");
scanf("%d",&num1);
scanf("%d",&num2);
scanf("%d",&num3);
Swap3(&num1, &num2, &num3);
printf("After Swap: %d, %d, %d\n",num1, num2, num3);
return 0;
}
/*
Enter three nums: 10 20 30
After Swap: 30, 10, 20
*/
โฒ const ์ ์ธ
(1) ํฌ์ธํฐ ๋ณ์๊ฐ ์ฐธ์กฐํ๋ ๋์์ ๋ณ๊ฒฝ์ ํ์ฉํ์ง ์๋ const ์ ์ธ (const int *ptr)
*ptr์ด ์์ํ
→ ๋งจ ์์ const ํค์๋๋ฅผ ์ด๋ค.
→ ๋ง์ฝ, const int *ptr = # ์ด๋ผ๋ฉด ptr์ด ๊ฐ๋ฆฌํค๋ ๋์์ ๋ฐ๊ฟ ์ ์๋ค. ๋ง์ฝ *ptr = 30;์ด๋ผ๊ณ ํ๋ฉด ptr์ด num์ด ์๋ 30์ ๊ฐ๋ฆฌํค๊ฒ ํ์์ผ๋ฏ๋ก, ์ค๋ฅ ๋ฐ์!
→ ์ฃผ์) ์ ์์ ์ฝ๋์์ num ์์ฒด์ ๊ฐ์ ๋ฐ๊ฟ ์๋ ์๋ค. ์ฆ, *ptr์ด ์์ํ๋๋ฏ๋ก, ptr์ ์ด์ฉํด ์ ๊ทผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๊ฟ ์ ์๋ค.
ex) ๋ฐ๋ผ์ ์๋์ ๊ฐ์ด num1์ ๊ฐ๋ฆฌํค๋ ptr์ด num2๋ฅผ ๊ฐ๋ฆฌํจ๋ค๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค! ํ์ง๋ง ptr์ด ๊ฐ๋ฆฌํค๋ ๊ณณ์ธ ์ฃผ์๋ ์ผ๋ง๋ ์ง ๋ฐ๊ฟ ์ ์๋ค.
#include <stdio.h>
int main(void) {
int num = 20;
int num2 = 30;
const int * ptr = #
ptr = &num2; // OK
num++; // OK
(*ptr)++; // ERROR
printf("%d\n",*ptr);
return 0;
}
(2) ํฌ์ธํฐ ๋ณ์์ ์์ํ (int * const ptr)
ptr์ด ์์ํ
→ const ์ ์ธ์ ํฌ์ธํฐ ๋ณ์ ์ด๋ฆ ์์ ์ฌ ์๋ ์๋ค.
→ int *const ptr = # ์ด๋ผ๋ฉด ํฌ์ธํฐ ๋ณ์ ptr ์์ฒด๊ฐ ์์๊ฐ ๋๋ค. ์ฆ, ํ ๋ฒ ์ฃผ์๊ฐ์ด ์ ์ฅ๋๋ฉด ๊ทธ ๊ฐ์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๋ป. ์ฆ, ํ ๋ฒ ๊ฐ๋ฆฌํค๊ธฐ ์์ํ ๋ณ์๋ฅผ ๋๊น์ง ๊ฐ๋ฆฌ์ผ์ผ ํ๋ค๋ ๋ป์ด๋ค.
→ ์ฆ, ํฌ์ธํฐ์ ๋ค์ด๊ฐ ์ฃผ์๊ฐ์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์, ํฌ์ธํฐ๋ ํด๋น ๋ฉ๋ชจ๋ฆฌ์ ์์น๋ฅผ ๋๊น์ง ๊ฐ๋ฆฌํค๊ณ , ๋ฉ๋ชจ๋ฆฌ์ ๋ค๋ฅธ ๊ณณ์ ๊ฐ๋ฆฌํฌ ์ ์๋ค. ํ์ง๋ง, ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ ๋ด์ฉ์ ๋ณ๊ฒฝํ ์๋ ์๋ค. ์ฆ, ์ ptr์์ *ptr = 40์ผ๋ก ์ค์ ํ๋ฉด num์ 40์ด ์ ์ฅ๋๋ค.
ex) ptr์ด ๊ฐ๋ฆฌํค๋ ๊ณณ์ด num์ด๋ผ๋ ๊ฒ์ ๋ฐ๊ฟ ์๊ฐ ์๋ค. ํ์ง๋ง, ๊ฐ๋ฆฌํค๋ ๊ณณ์ธ num์ ๋ด์ฉ์ ๋ฐ๊ฟ ์๋ ์๋ค. ์๋ ์์์์ 20์ด์๋๋ฐ 40์ผ๋ก ๋ฐ๋์์์ ํ์ธํ ์ ์๋ค. ๋ํ num ์์ฒด๋ ์ญ์ ๋ฐ๊ฟ ์ ์์ง๋ง, ptr์ด ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ ๋ฐ๊ฟ ์ ์๋ค.
#include <stdio.h>
int main(void) {
int num = 20;
int num2 = 30;
int * const ptr = #
*ptr = 40; /// OK
num = 30; // OK
ptr = &num2; // ERROR
printf("%d\n",*ptr);
return 0;
}
(3) const ๋ ๊ฐ ๋ชจ๋ ์ฌ์ฉ (const int * const ptr)
ptr์ด ์์ํ + *ptr๋ ์์ํ
→ *ptr๋ก๋ ๊ฐ๋ฆฌํค๋ ๊ณณ์ ๋ด์ฉ์ ๋ฐ๊ฟ ์ ์๊ณ , ptr์ ์ ์ฅ๋ ์ฃผ์๊ฐ๋ ๋ฐ๊ฟ ์ ์๋ค. ํ์ง๋ง, ๋ง์ฝ ๋ด๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ด ์ด๋ค ๋ณ์์ธ์ง ์๋ค๋ฉด(์: num), num์ ๊ฐ์ ์ผ๋ง๋ ์ง ๋ฐ๊ฟ ์ ์๋ค.
- ์ ๋ฆฌํ๋ฉด -
โป ptr ์์ const ์ ์ธ์ ๋ถ์ด๋ฉด ptr์ด ๊ฐ๋ฆฌํค๋ ํ์ดํ์ ๋ฐฉํฅ์ ๋ฐ๊ฟ ์ ์๊ณ
โป int * ptr ์์ const ์ ์ธ์ ๋ถ์ด๋ฉด ptr์ด ๊ฐ๋ฆฌํค๋ ๊ณณ(*ptr ์ฌ์ฉํ๋ฉด)์ ๋ด์ฉ์ ๋ฐ๊ฟ ์ ์๋ค.
- ๋ฐ๋๋ก ๋งํ๋ฉด -
โป ptr์์ const ์ ์ธ์ ๋ถ์ด๋ฉด ํ์ดํ๋ง ๊ณ ์ ์ด์ง, ptr์ด ๊ฐ๋ฆฌํค๋ ๊ณณ์ ๋ด์ฉ์ ์ผ๋ง๋ ์ง ๋ฐ๊ฟ ์ ์๋ค.
โป int * ptr ์์ const ์ ์ธ์ ๋ถ์ด๋ฉด ptr์ด ๊ฐ๋ฆฌํค๋ ๊ณณ์ ๋ด์ฉ๋ง ๋ฐ๊ฟ ์ ์์ ๋ฟ, ptr์ด ์ผ๋ง๋ ์ง ๋ฉ๋ชจ๋ฆฌ์ ๋ค๋ฅธ ๊ณณ์ ๊ฐ๋ฆฌํค๊ฒ ํ ์ ์๋ค.
โ ํ์ดํ๋ ๊ณ ์ / ๊ฐ๋ฆฌํค๋ ๊ณณ์ ๋ด์ฉ๋ ๊ณ ์ ํ๋ ค๋ฉด ๋ ๊ตฐ๋ฐ ๋ชจ๋ const ์ ์ธ ํ์ โ
โณ const ์ ์ธ์ ์๋ฏธ
→ const ์ ์ธ์ ๋ง์ด ํ๋ฉด ํ๋ก๊ทธ๋จ ์ฝ๋์ ์์ ์ฑ์ ๋์์ง๋ค. ์๋ฅผ ๋ค์ด, PI๋ ๊ฐ์ด ๋ณํ๋ฉด ์๋๋๋ฐ ์์ const ์ ์ธ์ ์๋ถ์ด๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํด๋ ์ปดํ์ผ๋ฌ๊ฐ ๋ฌธ์ ์ ์ ๋ฐ๊ฒฌํ ์ ์๋ค.
ex) ์๋ ์์ ์์ ๋งค๊ฐ๋ณ์ ์ ์ธ์์ ๋งค๊ฐ๋ณ์ arr์ ๋์์ผ๋ก const ์ ์ธ์ ํ ์ด์ ?
void ShowAllData(const int* arr, int len){
int i;
for(i=0;i<len;i++)
printf("%d ", arr[i]);
}
→ *arr์ด ๊ณ ์ ์ด๋ฏ๋ก, ํ๋ก๊ทธ๋๋จธ๊ฐ ์ค์๋ก ShowAllData() ํจ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ณผ์ ์์ ์๋์ ๋ฐฐ์ด์์ ๋ด์ฉ์ ์ค์๋ก ๋ฐ๊ฟ ์ ์๊ฒ๋, ์ฆ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊พธ์ง ์๊ฒ const ์ ์ธ์ ํ ๊ฒ์ด๋ค.
ex) ์๋์ ์์ ์์ ์ง์ ํ ๋งํ ์ฌํญ์?
#include <stdio.h>
void ShowData(const int *ptr){
int *rptr = ptr;
printf("%d \n",*rptr);
*rptr = 20;
}
int main(void) {
int num = 10;
int *ptr = #
ShowData(ptr);
return 0;
}
→ const ์ ์ธ์ผ๋ก *ptr ๊ฐ์ ์๋ฐ๊พธ๊ฒ๋ ์ค์ ํ์๋๋ฐ, rptr์ ๋ ๋ง๋ค์ด *rptr๊ฐ์ ๋ฐ๊พธ๊ฒ๋ ํด์ const ์ ์ธ์ด ์์ฉ์ด ์์ด์ก๋ค.
15. ๋์ ! ํ๋ก๊ทธ๋๋ฐ 2
* ๋์ 1) ๊ธธ์ด๊ฐ 10์ธ ๋ฐฐ์ด์ ์ ์ธํ๊ณ , ์ด 10๊ฐ์ ์ ์๋ฅผ ์ ๋ ฅ ๋ฐ์์, ํ์์ ์ง์๋ฅผ ๊ตฌ๋ถ ์ง์ด ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด ๋ณด์. ์ผ๋จ ํ์๋ถํฐ ์ถ๋ ฅํ๊ณ ๋์ ์ง์๋ฅผ ์ถ๋ ฅํ๋๋ก ํ์. ๋จ, 10๊ฐ์ ์ ์๋ main ํจ์ ๋ด์์ ์ ๋ ฅ๋ฐ๋๋ก ํ๊ณ , ๋ฐฐ์ด ๋ด์ ์กด์ฌํ๋ ํ์๋ง ์ถ๋ ฅํ๋ ํจ์์ ๋ฐฐ์ด ๋ด์ ์กด์ฌํ๋ ์ง์๋ง ์ถ๋ ฅํ๋ ํจ์๋ฅผ ๊ฐ๊ฐ ์ ์ํด์ ์ด ๋ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ํ๋ก๊ทธ๋จ์ ์์ฑํ์.
- ์คํ์ ์ -
์ด 10๊ฐ์ ์ซ์ ์ ๋ ฅ
์ ๋ ฅ: 1
์ ๋ ฅ: 2
์ ๋ ฅ: 3
์ ๋ ฅ: 4
์ ๋ ฅ: 5
์ ๋ ฅ: 6
์ ๋ ฅ: 7
์ ๋ ฅ: 8
์ ๋ ฅ: 9
์ ๋ ฅ: 0
ํ์ ์ถ๋ ฅ: 1, 3, 5, 7, 9
์ง์ ์ถ๋ ฅ: 2, 4, 6, 8, 0
#include <stdio.h>
void getOddNum(int *ptr,int len){
printf("print odd numbers: ");
int cnt = 0;
for(int i = 0; i < len; i++){
if ((*(ptr+i)) % 2 == 1){
cnt++;
}
}
for(int i = 0; i < len; i++){
if ((*(ptr+i)) % 2 == 1){
cnt--;
printf("%d",*(ptr+i));
if (cnt != 0){
printf(", ");
}
}
}
printf("\n");
}
void getEvenNum(int *ptr,int len){
printf("print even numbers: ");
int cnt = 0;
for(int i = 0; i < len; i++){
if ((*(ptr+i)) % 2 == 0){
cnt++;
}
}
for(int i = 0; i < len; i++){
if ((*(ptr+i)) % 2 == 0){
cnt--;
printf("%d",*(ptr+i));
if (cnt != 0){
printf(", ");
}
}
}
printf("\n");
}
int main(void) {
printf("Enter 10 numbers\n");
int arr[10];
for(int i =0; i < 10; i++){
printf("your number: ");
scanf("%d",&arr[i]);
}
getOddNum(arr,sizeof(arr)/sizeof(int));
getEvenNum(arr,sizeof(arr)/sizeof(int));
return 0;
}
* ๋์ 2) ํ๋ก๊ทธ๋จ ์ฌ์ฉ์๋ก๋ถํฐ 10์ง์ ํํ๋ก ์ ์๋ฅผ ํ๋ ์ ๋ ฅ ๋ฐ์ ๋ค์, ์ด๋ฅผ 2์ง์๋ก ๋ณํํด์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ
#include <stdio.h>
int main(void) {
int num;
int answer[1000];
int i = 0;
printf("decimal number: ");
scanf("%d", &num);
while (1) {
answer[i] = num%2;
i++;
if((num/2) == 1){
answer[i] = 1;
break;
}
num = num/2;
}
for(int j = 0; j < (i+1); j++){
printf("%d",answer[i-j]);
}
printf("\n");
return 0;
}
* ๋์ 3) ๊ธธ์ด๊ฐ 10์ธ ๋ฐฐ์ด์ ์ ์ธํ๊ณ , ์ด 10๊ฐ์ ์ ์๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค. ๋จ, ์ ๋ ฅ ๋ฐ์ ์ซ์๊ฐ ํ์์ด๋ฉด ๋ฐฐ์ด์ ์์์๋ถํฐ ์ฑ์๋๊ฐ๊ณ , ์ง์์ด๋ฉด ๋ค์์๋ถํฐ ์ฑ์๋๊ฐ๋ ํ์์ผ๋ก ์ถ๋ ฅ
#include <stdio.h>
int main(void) {
printf("Enter 10 numbers\n");
int arr[10];
int ans[10];
int start = 0, end = 9;
for(int i = 0; i < 10; i++){
printf("your number: ");
scanf("%d",&arr[i]);
if(arr[i]%2 == 1){
ans[start] = arr[i];
start++;
}
else{
ans[end] = arr[i];
end--;
}
}
for(int i = 0; i < 10; i++){
printf("%d ", ans[i]);
}
printf("\n");
return 0;
}
* ๋์ 4) ํ๋ฌธ์ธ์ง ์๋์ง๋ฅผ ํ๋จํด์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ๊ธฐ๋ฅ์ ํจ์ ์ ์. ๊ตฌํ์ ํธ์๋ฅผ ์ํด์ ๋์๋ฌธ์๊น์ง ์ผ์นํด์ผ ํ๋ฌธ ์ธ์
#include <stdio.h>
int isPalindrome(char *word, int length){
for(int i = 0; i < (length/2); i++){
if((*(word+i)) != (*(word+(length-1)-i))){
return 0;
}
}
return 1;
}
int main(void) {
char word[10000];
int length = 0;
printf("enter your string: ");
scanf("%s",word);
while(word[length] != 0){
length++;
}
if (isPalindrome(word,length) == 1){
printf("this is palindrome\n");
}
else{
printf("this is not a palindrome\n");
}
return 0;
}
* ๋์ 5) BubbleSort ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ ํจ์(DesSort; ๋ฐฐ์ด์ ์ธ์๋ก ์ ๋ฌ) ๋ง๋ค๊ธฐ, ๊ธธ์ด๊ฐ 7์ธ intํ ๋ฐฐ์ด ์ ์ธ: 7๊ฐ์ ์ ์ ์ ๋ ฅ ๋ฐ๊ธฐ. DesSort() ํจ์ ์ดํ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ์์ ์์๋๋ก ์ถ๋ ฅํ๊ธฐ
ex)
enter: 1
enter: 2
enter: 3
enter: 4
enter: 5
enter: 6
enter: 7
#include <stdio.h>
void DesSort(int param[], int len){
int end = len - 1, start = 0;
int * init = param;
for(int k = 0; k < len; k++){
start = 0;
param = init;
while(start < end){
if(*param < *(param+1)){
int temp;
temp = *(param+1);
*(param+1) = *param;
*param = temp;
}
param++;
start++;
}
end--;
}
}
int main(void) {
int arr[7];
for(int i = 0; i < 7; i++){
printf("enter: ");
scanf("%d",&arr[i]);
}
DesSort(arr, sizeof(arr)/sizeof(int));
for(int j = 0; j < 7; j++){
printf("%d ",arr[j]);
}
printf("\n");
return 0;
}
→ DesSort() ์ด๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค
void DesSort(int param[], int len){
int a, b, temp;
for(int a = 0; a < len; a++){
for(int b = 0; b < (len-a); b++){
if(param[b] < param[b+1]){
temp = param[b+1];
param[b+1] = param[b];
param[b] = temp;
}
}
}
}
* ์ถ์ฒ) <์ค์ฑ์ฐ์ ์ดํ Cํ๋ก๊ทธ๋๋ฐ>
* ์ ํฌ์ธํฐ ๋ณ์ ๊ทธ๋ฆผ 1๊ฐ ์ฐธ์กฐ https://pridiot.tistory.com/214
* ์ ๋ฐฐ์ด ํฌ์ธํฐ ๊ทธ๋ฆผ 1๊ฐ ์ฐธ์กฐ https://sejong-kr.libguides.com/c.php?g=942235&p=6822367
'C, C++ > Fundamentals' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
C Basics 5/ (์ดํ ํ๋ก๊ทธ๋๋ฐ) (0) | 2023.07.26 |
---|---|
C Basics 3/ (์ดํ Cํ๋ก๊ทธ๋๋ฐ) (0) | 2023.06.27 |
C Basics 2/ (์ดํ Cํ๋ก๊ทธ๋๋ฐ) (0) | 2023.06.26 |
C Basics 1/ (0) | 2023.06.25 |
C fundamentals (1) (1) | 2023.06.16 |
๋๊ธ