C에서는 배열을 함수에 전달할수 없으며, 단지 배열에 대한 포인터만 전달할 수 있다.
포인터 = 배열의 0번째 주소.
#연산자 우선순위
() > ++ > * > +
p.206
#include <stdio.h>
int main(void)
{
int a[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
int *p;
p=a;
printf("%d %d %d\n", *p, *(p+1), *(p+2)); //포인터p가 가리키는 값 증가.
printf("%d %d %d\n", a[0], a[1], a[2]);
return 0;
}
p.207
#include <stdio.h>
int main(void)
{
char str[] = "Pointers are fun";
char *p; //포인트 변수선언
int i;
p = str; //포인트변수p의 배열변수str에 주소치환
for(i=0; p[i]; i++) printf("%c", p[i]);
return 0;
}
*
#include <stdio.h>
int main(void)
{
char str[] = "hello"; //char *p = "hello";
char *p; //문자열의 포인터가 되는 0번째 배열의 주소만
p = "hello"; //참조하기 때문에 가능한 문법.
p = str;
puts(p);
return 0;
}
*배열명은 상수이므로 증감시킬수 없다.
p.209
#include <ctype.h> //toupper(), tolower()함수 사용
#include <stdio.h>
int main(void)
{
char str[80];
int i;
printf("Enter a string: ");
gets(str);
for(i=0; str[i]; i++) str[i] = toupper(str[i]); //대문자로 바꾼다.
printf("%s\n", str);
for(i=0; str[i]; i++) str[i] = tolower(str[i]); //소문자로 바꾼다.
printf("%s\n", str);
return 0;
}
p.210
#include <ctype.h> //toupper(), tolower()함수 사용
#include <stdio.h>
int main(void)
{
char str[80], *p;
printf("Enter a string: ");
gets(str);
p = str;
while(*p) { //포인터 p가 널값을 가리키게 되면 반복 중지
*p++ = toupper(*p);
// p++; //포인터 p 증가
}
printf("%s\n", str);
p = str;
while(*p) {
*p = tolower(*p);
p++;
}
printf("%s\n", str);
return 0;
}
*p++ = toupper(*p);
-> ++가 p다음에 오기 때문에 p가 가리키는 값을 먼저 얻을 수 있고,
그 다음 p가 다음 원소를 가리키기 위하여 증가된다.
p.211
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[] = "Pointers are fun to use";
char str2[80], *p1, *p2;
p1 = str1 + strlen(str1) -1;
p2 = str2;
while(p1>=str1) *p2++ = *p1--;
*p2 = '\0';
printf("%s %s", str1, str2);
return 0;
}
p.212_2
#include <stdio.h>
int main(void)
{
int temp[5] = {10, 19, 23, 8, 9};
int *p;
p = temp;
printf("%d ", *(p+3));
return 0;
}
p212_3
#include <stdio.h>
int main(void)
{
char str[80], *p;
printf("enter string : \n");
gets(str);
p = str;
while(*p && *p != ' ') p++; //p가 공백을 가리키지 않으면 p를 증가시킨다.
printf("%s", p);
return 0;
}