쉽게 풀어쓴 C언어 Express 11장 Exercise
11장 Exercise
1. (a) 처럼 바꾸시오
(a) list[6] -> *(list+6)
(b) name[3] ->*(name+3)
(c) *(cost+8) -> cost[8]
(d) message[0] -> *message
비고) a+i는 &a[i]와 같고, *(a+i)는 a[i]와 동일하다
2. 알맞은 문장 넣기
char code;
char *p; // char형 포인터 p선언
p=&code; // 포인터에 변수 code의 주소 대입
*p='a'; // 포인터를 통하여 변수 code에 'a' 대입하기
3. int a[]={10, 20, 30, 40, 50}으로 정의되었다고 가정할 때, *(a+2)의 값은? ③30
4. 아래의 문장이 실행되었을 때 다른 문장들과 실행 결과가 다른것은? ③*p++
int i;
int *p=&i;
비고) ③*p++은 p가 가르키는 i값을 가져오고 p를 1증가시키는 것이다.
①②④ i를 1 증가한다.
int *p=&i; = int *p; + p=&i;
5. 다음 프로그램의 출력은? 5, 6
int x=6;
int *p=&x;
printf("%d\n", --(*p));
printf("%d\n", (*p)++);
6. 다음 프로그램의 출력은? 1008, 2008
int *p = (int *)1000;
double *q = (double *)2000;
printf("%d\n", p+2);
printf("%d\n", q+1);
비고) 결과값 : x+sizeof(x)*integer
7. 다음 프로그램의 출력은? 0, 1, 2
int list[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int *p;
p=list;
printf("%d\n", *list);
printf("%d\n", *p+1);
printf("%d\n", *p+2);
비고) %d대신 %x로 바꾸고 *을 제거하면 주소들이 출력된다.
8. double형 배열을 매개 변수 a로 전달받는 함수 print_array()의 헤더를 다음과 같은 방법으로 작성하라. 반환값은 없다.
(a) b를 배열로 선언
print_array(double a[]);
(b) b를 포인터로 선언
print_array(double *a);
9. 다음 프로그램에서 ip의 값이 변경되지 않는 이유는 무엇인가?
void f(int *p)
{
static int data 5;
p=&data;
}
int main()
{
int*ip=NULL;
f(ip;)
}
모든 변수는 메모리에 값을 저장한다. 주소로 각각의 위치를 구별하여 저장하며 포인터 변수는 메모리의 주소를 지정하는 값을 가진다. 정적변수 역시 메모리에 배치되고 주소값을 가진다. 그러나 기계어 코드에 주소값을 고정하여 액세스된다. 즉 정적변수를 가르키는 포인터는 가르키는 주소값이 정적변수에 의해 고정되어 변경되지 않게 된다.