printf("ho_tari\n");
C언어(4) 본문
2025.02.21
배열과 포인터의 차이점
1. sizeof 연산의 결과가 다르다.
2. 변수와 상수의 차이가 있다.
값 | 주소 | |
포인터 | *b | b |
변수 | a | &a |
double ary[5] = { 1.2, 3.5, 7.4, 0.5, 10.0 };
double *pa = ary;
double *pb = ary + 2;
ary배열 100 108 116 124 132
1.2 3.5 7.4 0.5 10.0
ary = 100
*(ary + 1)= 3.5
pa + 2 = 116
pa[3] = 0.5
*pb = 7.4
pb - pa = 16
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
/*
int main(void) {
int array[4];
for (int i = 0; i < 4; i++)
{
printf("array[%d]의 주소 = %u\n", i, &array[i]);
}
return 0;
}*/
/*
int main(void) {
int ary[3];
int i;
// &ary[0] = ary 주소는 같음
// *(&ary[0]) = *ary = ary[0] 값은 같음
// ary + 1 = &ary[0] + 1 = &ary[1]
// *(ary + 1) = *(&ary[0] + 1) = *(&ary[1]) 주소가 가르키는 위치의 값은 모두 같음
*(ary + 0) = 10;
*(ary + 1) = *(ary + 0) + 10;
printf("세번째 배열 요소에 키보드 입력 : ");
scanf("%d", ary + 2);
for (i = 0; i < 3; i++)
{
printf("%5d", *(ary + i));
}
return 0;
}
*/
/*
int main(void) {
int ary[3];
int* pa = ary;
int i;
*pa = 10;
*(pa + 1) = 20;
pa[2] = pa[0] + pa[1];
for (i = 0; i < 3; i++)
{
printf("%5d", pa[i]);
}
return 0;
}*/
/*
int main(void) {
int ary[3] = { 10, 20, 30 };
int* pa = ary;
int i;
for (i = 0; i < 3; i++)
{
printf("%5d", *(pa++));
}
return 0;
}*/
/*
int main(void) {
int ary[5] = { 10, 20, 30, 40, 50 };
int* pa = ary;
int* pb = pa + 3;
printf("pa : % u\n", pa);
printf("pb : 5u\n", pb);
pa++;
printf("pb - pa : %u\n", pb - pa);
printf("앞에 있는 배열의 요소의 값을 출력 : ");
if (pa < pb)
{
printf("%d\n", *pa); // pa와 pa의 주소를 비교하여 작은 주소의 값을 출력
}
else
{
printf("%d\n", *pb);
}
return 0;
}*/
/*
void print_ary(int* pa);
int main(void) {
int ary[5] = { 10, 20, 30, 40, 50 };
print_ary(ary);
return 0;
}
void print_ary(int* pa) {
int i;
for (i = 0; i < 5; i++)
{
printf("%d ", pa[i]);
}
}*/
/*
void print_ary(int* pa, int size);
int main(void) {
int ary1[5] = { 10, 20, 30, 40, 50 };
int ary2[7] = { 10, 20, 30, 40, 50, 60, 70 };
print_ary(ary1, 5);
printf("\n");
print_ary(ary2, 7);
return 0;
}
void print_ary(int* pa, int size) {
int i;
for (i = 0; i < size; i++)
{
printf("%d ", pa[i]);
}
}*/
/*
void input_ary(double* pa, int size);
double find_max(double* pa, int size);
int main(void) {
double ary[5];
double max;
int size = sizeof(ary) / sizeof(ary[0]);
input_ary(ary, size);
max = find_max(ary, size);
printf("배열의 최댓값 : %.1lf\n", max);
return 0;
}
void input_ary(double* pa, int size) {
int i;
printf("%d개의 실수값 입력 : ", size);
for (i = 0; i < size; i++)
{
scanf("%lf", pa + i);
}
}
double find_max(double* pa, int size) {
double max;
int i;
max = pa[0];
for (i = 0; i < size; i++)
{
if (pa[i] > max)
{
max = pa[i];
}
}
return max;
}*/
/*
void print_month(int* mp) {
int i;
for (i = 0; i < 12; i++)
{
printf("%5d", mp[i]);
if (i % 5 == 4)
{
printf("\n");
}
}
}
int main(void) {
int month[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
print_month(month);
return 0;
}*/
/*
void input_nums(int* lotto_nums);
void print_nums(int* lotto_nums);
int main(void) {
int lotto_nums[6];
input_nums(lotto_nums);
print_nums(lotto_nums);
return 0;
}
void input_nums(int* lotto_nums) {
int num;
int dup;
for (int i = 0; i < 6; i++)
{
printf("번호 입력 : ");
scanf("%d", &num);
dup = 0;
for (int j = 0; j < i; j++)
{
if (lotto_nums[j] == num)
{
dup = 1;
break;
}
}
if (!dup)
{
lotto_nums[i] = num;
}
else
{
printf("같은 번호가 있습니다!\n");
i--;
}
}
}
void print_nums(int* lotto_nums){
int i;
printf("로또 번호 : ");
for (i = 0; i < 6; i++)
{
printf("%d ", lotto_nums[i]);
}
}*/
/*
void input_nums(int* lotto_nums);
void print_nums(int* lotto_nums);
int main(void) {
int lotto_nums[6];
input_nums(lotto_nums);
print_nums(lotto_nums);
return 0;
}
void input_nums(int* lotto_nums) {
int count = 0;
while (1) {
int num;
_Bool check = 0;
printf("번호 입력 : ");
scanf("%d", &num);
if (num < 1 || num > 45)
{
printf("범위를 초과했습니다.\n");
check = 1;
}
for (int i = 0; i < count; i++)
{
if (num == lotto_nums[i])
{
printf("같은 번호가 있습니다!\n");
check = 1;
break;
}
}
if (check == 0)
{
lotto_nums[count++] = num;
if (count == 6)
{
break;
}
}
}
}
void print_nums(int* lotto_nums) {
int i;
printf("로또 번호 : ");
for (i = 0; i < 6; i++)
{
printf("%d ", lotto_nums[i]);
}
}*/
/*
int main(void) {
printf("%d, %c\n", 97, 97);
printf("%d, %c\n", 'a', 'a');
return 0;
}*/
/*
int main(void) {
char small, cap = 'G';
if ((cap >= 'A') && (cap <= 'Z'))
{
small = cap + ('a' - 'A');
}
printf("대문자 : %c %c", cap, '\n');
printf("소문자 : %c", small);
return 0;
}*/
/*
int main(void) {
int ch;
ch = getchar();
printf("입력한 문자 : ");
putchar(ch);
putchar('\n');
return 0;
}*/
/*
int main(void) {
char ch;
printf("문자 입력 : ");
ch = getchar();
printf("%c문자의 아스키 코드 값 : %d", ch, ch);
return 0;
}*/
/*
int main(void) {
char ch;
int i;
for (i = 0; i < 3; i++)
{
scanf("%c", &ch);
printf("%c", ch);
}
return 0;
}*/
/*
int main(void) {
int res;
char ch;
while (1) {
res = scanf("%c", &ch);
if (res == -1)
{
break;
}
printf("%d ", ch);
}
return 0;
}*/
/*
void my_gets(char* str, int size);
int main(void) {
char str[7];
my_gets(str, sizeof(str));
printf("입력한 문자열 : %s\n", str);
return 0;
}
void my_gets(char* str, int size) {
int ch;
int i = 0;
ch = getchar();
while ((ch != '\n') && (i < size - 1))
{
str[i] = ch;
i++;
ch = getchar();
}
str[i] = '\0'; // 문자열 마지막에 널기호 추가
}*/
/*
int main(void) {
int num, grade;
printf("학번 입력 : ");
scanf("%d", &num);
getchar();
printf("학점 입력 : ");
grade = getchar();
printf("학번 : %d, 학점 : %c", num, grade);
return 0;
}*/
/*
int main(void) {
int ch;
int cnt = 0;
ch = getchar();
while (ch != '\n')
{
if (ch >= 'a' && ch <= 'z')
{
cnt++;
}
ch = getchar();
}
printf("소문자의 개수 : %d\n", cnt);
return 0;
}*/
/*
int main(void) {
char ch;
int len, max = 0;
while (1)
{
ch = getchar();
if (ch == -1)
{
break;
}
len = 0;
while (ch != '\n')
{
len++;
ch = getchar();
}
if (len > max)
{
max = len;
}
}
printf("가장 긴 단어의 길이 : %d\n", max);
return 0;
}*/
/*
int main(void) {
printf("apple이 저장된 시작 주소 값 : % p\n", "apple");
printf("두 번째 문자의 주소 값 : %p\n", "apple" + 1);
printf("첫 번째 문자 : %c\n", *"apple");
printf("두 번째 문자 : %c\n", *("apple" + 1));
printf("배열로 표현한 세 번째 문자 : %c\n", "apple"[2]);
return 0;
}*/
/*
int main(void) {
char* dessert = "apple";
printf("오늘 후식은 %s입니다.\n", dessert);
dessert = "banana";
printf("내일 후식은 %s입니다.\n", dessert);
return 0;
}*/
/*
int main(void) {
char str[80];
printf("문자열 입력 : ");
scanf("%s", str);
printf("첫 번째 단어 : %s\n", str);
scanf("%s", str);
printf("버퍼에 남아 있는 두 번째 단어 : %s\n", str);
return 0;
}*/
/*
int main(void) {
char str[80];
printf("공백이 포함된 문자열 입력 : ");
gets(str);
printf("입력한 문자열은 %s입니다.", str);
return 0;
}*/
#include <string.h>
/*
int main(void) {
char str[80];
printf("공백이 포함된 문자열 입력 : ");
fgets(str, sizeof(str), stdin);
str[strlen(str) - 1] = '\0';
printf("입력된 문자열은 %s입니다.\n", str);
return 0;
}*/
/*
int main(void) {
int age;
char name[20];
printf("나이 입력 : ");
scanf("%d", &age);
// getchar();
// scanf("%*c");
fgetc(stdin);
printf("이름 입력 : ");
gets(name);
printf("나이 : %d, 이름 : %s\n", age, name);
return 0;
}
*/
/*
int main(void) {
char str[80] = "apple juice";
char* ps = "banana";
puts(str);
fputs(ps, stdout);
puts("milk");
return 0;
}*/
/*
char* my_gets(char *ps) {
int i = 0;
static char str[20];
char ch;
do
{
ch = getchar();
ps[i] = ch;
i++;
} while (ch != '\n');
ps[--i] = '\0';
// ps = str;
}
int main(void) {
char str[80];
my_gets(str);
printf(str);
return 0;
}
*/
/*
int main(void) {
char* ps = "applepie";
ps += 5;
printf("%s", ps);
return 0;
}*/
/*
int main(void) {
char ani[20];
char why[80];
printf("좋아하는 동물 : ");
scanf("%s", ani);
fgetc(stdin);
printf("좋아하는 이유 : ");
fgets(why, sizeof(why), stdin);
printf("%s is %s", ani, why);
return 0;
}*/
/*
int main(void) {
char str[20] = "mango tree";
strncpy(str, "apple-pie", 5);
str[5] = '\0';
printf("%s\n", str);
return 0;
}*/
/*
int main(void) {
char str[80] = "straw";
strcat(str, "berry");
printf("%s\n", str);
strncat(str, "piece", 3);
printf("%s\n", str);
return 0;
}*/
/*
int main(void) {
char str1[80], str2[80];
char* resp;
printf("2개의 과일 이름 입력 : ");
scanf("%s%s", str1, str2);
if (strlen(str1) > strlen(str2))
{
resp = str1;
}
else
{
resp = str2;
}
printf("이름이 긴 과일은 : %s\n", resp);
return 0;
}*/
/*
int main(void) {
char str1[80] = "pear";
char str2[80] = "peach";
printf("사전에 나중에 나오는 과일 이름 : ");
if (strcmp(str1, str2) > 0)
{
printf("%s\n", str1);
}
else
{
printf("%s\n", str2);
}
return 0;
}*/
/*
char* my_strcpy(char* pd, char* ps);
int main(void) {
char str[80] = "strawberry";
printf("바꾸기 전 문자열 : %s\n", str);
my_strcpy(str, "apple");
printf("바꾼 후 문자열 : %s\n", str);
printf("다른 문자열 대입 : %s\n", my_strcpy(str, "kiwi"));
return 0;
}
char* my_strcpy(char* pd, char* ps) {
char* po = pd;
while (*ps != '\0')
{
*pd = *ps;
pd++;
ps++;
}
*pd = '\0';
return po;
}*/
/*
int main(void) {
char str1[80] = "straw,hello,hi";
char str2[80] = { 0 };
char* word1 = strchr(str1, ',');
strncpy(str2, str1, word1 - str1);
printf("%s\n", str2);
word1++;
char* word2 = strchr(word1, ',');
strncpy(str2, word1, word2 - word1);
printf("%s\n", str2);
return 0;
}*/
/*
int main(void) {
char str1[80] = "straw,hello,hi";
char str2[80] = { 0 };
// strcpy, strncpy, strcat, strncat
// strchr : 문자열에서 특정 문자가 시작되는 위치의 주소를 반환한다.
// strtok : 문자열을 특정 문자로 분리하여 반환한다.
char* token = strtok(str1, ",");
printf("%s\n", token);
token = strtok(NULL, ",");
printf("%s\n", token);
return 0;
}
*/