6장 연습문제

pb06-01  포인터란 무엇인지 간략히 기술하라.


pb06-02  배열명은 포인터 변수이다. 일반적인 포인터 변수와 배열명의 차이점에 대해서 기술하라.


pb06-03  주어진 문자열의 길이를 구하는 프로그램을 작성하라.


pb06-04  문자열에 포함된 소문자를 전부 대문자로 바꾸는 프로그램을 작성하라.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

7.13 표준함수  (0) 2016.05.30
7.10 지역배열과 전역배열  (0) 2016.05.30
3장 연습문제 풀이 동영상  (0) 2016.04.18
8.6 구조체 포인터 변수  (0) 2016.04.15
8.5 구조체 배열  (0) 2016.04.15
Posted by 살레시오
,


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

7.10 지역배열과 전역배열  (0) 2016.05.30
6장 연습문제  (0) 2016.05.30
8.6 구조체 포인터 변수  (0) 2016.04.15
8.5 구조체 배열  (0) 2016.04.15
8.4 구조체를 필드로 가지는 구조체  (0) 2016.04.15
Posted by 살레시오
,

8.6 구조체 포인터 변수     [gdoc]     [smts]

 구조체 변수도 포인터로 선언할 수 있으며 문법은 기본 자료형의 경우와 동일하다.


Point *pa;

이렇게 선언하면 pa는 Point 구조체 포인터 변수이다. 구조체 포인터는 미리 정의된 Point 변수를 이용하여 초기화할 수 있다.


Point a = {0, 1};
Point *pa = &a;

또는 malloc()함수를 이용하여 메모리를 할당할 수도 있다.


Point *pa = malloc(sizeof(Point);


포인터 변수의 경우 필드는 다음과 같이 ‘->’ 연산자를 사용하여 접근할 수 있다.


pa->x = 0;
pa->y = 1;

즉, 구조체 포인터의 접근자는 점(.)이 아니라 ‘->’ 이다.


0806-01.c

#include <stdio.h>
#include <stdlib.h>

typedef struct {
double x;
double y;
} Point;

int main(int argc, char **argv) {
Point a = {11,12};
   Point *pa = &a;
   
   pa->x = 11.5;
   pa->y = 12.6;
   
   Point *pb = malloc(sizeof(Point));
   pb->x = 13;
   pb->y = 14;
   
   printf("a.x=%lf, a.y=%lf\n", a.x, a.y);
   printf("pa->x=%lf, pa->y=%lf\n", pa->x, pa->y);
   printf("pb->x=%lf, pb->y=%lf\n", pb->x, pb->y);
   
   free(pb);
}

a.x=11.500000, a.y=12.600000
pa->x=11.500000, pa->y=12.600000
pb->x=13.000000, pb->y=14.000000

이 예에서 pa는 a로 초기화 시켰다. 따라서 pa->x 와 pa->y 는 a.x와 a.y는 서로 동일한 데이터이며 한 쪽을 변경하면 다른 쪽도 자동으로 변경된다. 그리고 pb는 별도의 메모리를 malloc() 함수를 이용하여  할당시켰다. 이 경우 반드시 free()함수를 이용하여 사용한 메모리를 반환해야 한다.


 함수로 구조체 변수를 넘길 때 복사본이 넘어가는 것은 기본 자료형과 같다. 따라서 어떤 함수에서 넘겨받은 구조체 변수의 필드를 변경하는 것은 원래 변수에 아무런 영향을 미치지 않는다.


0806-02.c

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

void showInfo(Point a) {
printf("(%f, %f)", a.x, a.y);
}

void changeToOrigin(Point a) {
a.x = 0;
a.y = 0;
}

int main(int argc, char **argv) {
Point a = {11,12};
printf("a:(%.2f, %.2f)\n", a.x, a.y);
changeToOrigin(a);
printf("a:(%.2f, %.2f)\n", a.x, a.y);
}

실행 결과

a:(11.00, 12.00)
a:(11.00, 12.00)

위 예에서 changeToOrigin()함수를 호출할 때 Point 변수 a를 넘기고 이것이 함수 내부에서 원점으로 변경되었지만 원래 변수에는 전혀 영향을 미치지 않느다. 왜냐면 구조체 변수의 복사본이 함수로 넘어가기 때문이다.


 하지만 함수로 포인터를 넘기면 원래 구조체 필드를 직접 접근할 수 있다.


0806-03.c

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

void showInfo(Point a) {
printf("(%f, %f)", a.x, a.y);
}

void changeToOrigin(Point *a) {
a->x = 0;
a->y = 0;
}

int main(int argc, char **argv) {
Point a = {11,12};
printf("a:(%.2f, %.2f)\n", a.x, a.y);
changeToOrigin(&a); //<- 포인터를 넘긴다.
printf("a:(%.2f, %.2f)\n", a.x, a.y);
}

실행 결과

a:(11.00, 12.00)
a:(0.00, 0.00)

위에서는 changeToOrigin()함수가 Point형 포인터를 받아서 필드를 변경한다. 호출하는 쪽에서도 a변수의 포인터(&a)를 넘겨준다. 이러면 changeToOrigin()함수 내부에서 원본을 변경할 수 있다. 실행 결과에서 보면 변수 a의 필드들이 변경되었음을 알 수 있다.

'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

6장 연습문제  (0) 2016.05.30
3장 연습문제 풀이 동영상  (0) 2016.04.18
8.5 구조체 배열  (0) 2016.04.15
8.4 구조체를 필드로 가지는 구조체  (0) 2016.04.15
8.3 구조체를 함수의 인자로 넘기기  (0) 2016.04.15
Posted by 살레시오
,

8.5 구조체 배열     [gdoc]     [smts]

 기본 자료형과 마찬가지로 구조체 변수도 배열을 형성할 수 있다. 예를 들어 Point 형 변수 세 개를 배열로 생성하고 싶다면 다음과 같이 하면 된다.


Point pa[3];

이렇게 하면 크기가 3인 Point형 배열 변수 pa가 생성된다. 초기화 방법은 배열의 초기화와 동일하다.


Point p0 = {0,0};
Point p1 = {1,1};
Point p2 = {2,2};
Point pa[3] = {p0, p1, p2};

또는 다음과 같이 바로 초기화를 할 수도 있다.


Point pa[3] = {{0,0}, {1,1}, {2,2}};

배열 각 요소를 통하여 구조체의 필드를 접근할 수 있다.


Point pa[3];
pa[0].x = 0;
pa[0].y = 0;
pa[1].x = 1;
pa[1].y = 1;
pa[2].x = 2;
pa[2].y = 2;

동일한 방법으로 초기화 이후에도 각 필드의 값을 자유롭게 접근하여 읽거나 변경할 수 있다.


 배열의 크기가 커지면 반복문을 이용하여 구조체 필드를 초기화하는 것이 일반적이다. 예를 들면 다음과 같다.


ex08-09.c

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

int main(int argc, char **argv) {
Point pta[100];
for (int k=0; k<100; k++) {
pta[k].x = 1;
pta[k].y = 1;
}
}

또는 미리 정의된 Point형 변수를 이용할 수도 있다.


ex08-09.c

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

int main(int argc, char **argv) {
Point pt = {1,1};
Point pta[100];
     // 100개의 요소를 pt로 초기화시킨다.
for (int k=0; k<100; k++) {
pta[k] = pt;
}
}

이와 같이 구조체도 배열을 생성하여 사용할 수 있다.


Posted by 살레시오
,

8.4 구조체를 필드로 가지는 구조체     [gdoc]     [smts]

 어떤 구조체의 필드가 다른 구조체의 변수가 될 수도 있다. 직사각형의 정보를 갖는 Rect라는 구조체를 작성해 보자. 이 구조체는 마주보는 두 꼭지점의 의 좌표를 가지고 있어야 한다.


typedef struct {
double x;
double y;
} Point;

typedef struct {
Point leftTop;
Point rightBot;
} Rect;

여기에서 보면 Rect 구조체는 두 개의 Point 구조체 변수를 가지고 있다. 이런 식으로 구조체의 필드가 다른 구조체의 변수가 될 수 있다.


 구조체 Rect를 초기화 시키는 방법은 다음과 같이 몇 가지 방법이 있다.


// 초기화 방법 1 : 모든 구조체 변수를 생성과 동시에 초기화함
Rect ra = {{0, 1}, {11, 12}};
// 초기화 방법 2 : 이미 정의된 Point 변수 이용
Point p1 = {0, 1}, p2 = {11, 12};
Rect rb = {p1, p2};
// 초기화 방법 3: 선언 후 각각의 필드에 초기값 대입
Rect rc;
rc.leftTop.x = 0;
rc.leftTop.y = 1;
rc.rightBot.x = 11;
rc.rightBot.y = 12;

이제 사각형의 면적을 구하는 함수를 추가한 전체 소스 코드는 다음과 같다.


ex08-08.c

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

typedef struct {
Point leftTop;
Point rightBot;
} Rect;

double calcArea(Rect);

int main(int argc, char **argv) {
// 초기화 방법 1 : 모든 구조체 변수를 생성과 동시에 초기화함
Rect ra = {{0, 1}, {11, 12}};
// 초기화 방법 2 : 기정의 된 Point 변수 이용
Point p1 = {0,1}, p2 = {11, 12};
Rect rb = {p1, p2};
// 초기화 방법 3: 선언 후 각각의 필드에 초기값 대입
Rect rc;
rc.leftTop.x = 0;
rc.leftTop.y = 1;
rc.rightBot.x = 11;
rc.rightBot.y = 12;
printf("area of ra : %f\n", calcArea(ra));
printf("area of rb : %f\n", calcArea(rb));
printf("area of rc : %f\n", calcArea(rc));
}

double calcArea(Rect r) {
double dx = r.rightBot.x - r.leftTop.x;
double dy = r.rightBot.y - r.leftTop.y;
return dx*dy;
}

실행 결과

area of ra : 121.000000
area of rb : 121.000000
area of rc : 121.000000

이와 같이 구조체의 필드로 다른 구조체 변수도 얼마든지 사용할 수 있다. 다만 구조체를 정의하는 순서에 유의하면 된다. 당연한 얘기지만 Rect 구조체가 Point 구조체 뒤에 와야 한다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

8.6 구조체 포인터 변수  (0) 2016.04.15
8.5 구조체 배열  (0) 2016.04.15
8.3 구조체를 함수의 인자로 넘기기  (0) 2016.04.15
8.2 구조체 필드의 초기화  (0) 2016.04.15
8.1 구조체의 정의  (0) 2016.04.15
Posted by 살레시오
,

8.3 구조체를 함수의 인자로 넘기기     [gdoc]     [smts]

 구조체는 정의되면 새로운 자료형처럼 사용할 수 있으며 기본 자료형을 함수에 넘기는 것과 동일한 방법으로 구조체 변수도 사용할 수 있다. 전 절에서 예로 든 Point 구조체를 예로 들어서 두 점간의 거리를 구하는 함수를 작성해 보자. 함수의 이름은 getDist()라고 하고 Point 구조체 변수 두 개를 받아서 double형 값(거리)를 반환해야 한다. 함수 본체는 다음과 같이 작성할 수 있다.


double getDist(Point a, Point b) {
double dx = b.x - a.x;
double dy = b.y - a.y;
double dist = sqrt(dx*dx + dy*dy);
return dist;
}

여기서 함수 헤더를 보면 기본 자료형의 경우와 동일한 방법으로 포인터 변수를 받음을 알 수 있다. 지역변수 a와 b는 Point형 변수이므로 Point구조체의 필드를 사용할 수 있다.


 두 점의 거리를 구하는 전체 프로그램은 다음과 같다.


ex08-06.c

#include <stdio.h>
#include <math.h>

typedef struct {
double x;
double y;
} Point;

double getDist(Point a, Point b);

int main(int argc, char **argv) {
Point a = {1.1, 2.2};
Point b = {3.3, 4.4};

double dist = getDist(a, b); //함수 호출
printf("a = {%f, %f}\n", a.x, a.y);
printf("b = {%f, %f}\n", b.x, b.y);
printf("dist = %f\n", dist);
}

double getDist(Point a, Point b) {
double dx = b.x - a.x;
double dy = b.y - a.y;
double dist = sqrt(dx*dx + dy*dy);
return dist;
}

실행 결과

a = {1.100000, 2.200000}
b = {3.300000, 4.400000}
dist = 3.111270

함수 getDist() 내에서 수학함수 sqrt()를 사용하기 위해서 math.h를 인클루드 시켰다.


 이와 같이 구조체를 정의하는 것은 새로운 자료형을 만드는 것과 같다. 구조체가 한 번 정의되면 기본 자료형과 동일한 방법으로 변수를 생성할 수 있고 함수의 인자로 넘길 수 있으며 함수의 반환값이 될 수도 있다. 예를 들어서 두 점의 좌표를 받아서 Point형 변수를 반환하는 간단한 함수를 작성해 보자.


ex08-07.c

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

Point getPoint(double, double); //← (1)

int main(int argc, char **argv) {
Point a = getPoint(0,0);
Point b = getPoint(1,1);
printf("a = {%f, %f}\n", a.x, a.y);
printf("b = {%f, %f}\n", b.x, b.y);
}

Point getPoint(double x, double y) {
Point a = {x, y};
return a;
}

실행 결과

a = {0.000000, 0.000000}
b = {1.000000, 1.000000}

이 예에서 getPoint()함수는 Point형 변수를 반환한다. 따라서 함수를 선언할 때 반환형을 (1)과 같이 명시해야 한다. 그리고 함수 내부에서는 Point형 변수를 return해야 한다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

8.5 구조체 배열  (0) 2016.04.15
8.4 구조체를 필드로 가지는 구조체  (0) 2016.04.15
8.2 구조체 필드의 초기화  (0) 2016.04.15
8.1 구조체의 정의  (0) 2016.04.15
6.5 문자열과 포인터  (0) 2016.04.15
Posted by 살레시오
,

8.2 구조체 필드의 초기화     [gdoc]     [smts]

 구조체를 초기화하는 방법은 선언과 동시에 초기화하는 방법과 이미 선언된 구조체를 초기화시키는 방법 두 가지가 있다. 선언과 동시에 초기화하는 예를 들면 다음과 같다.


ex08-01

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

int main(int argc, char **argv) {
Point a = {1.0, 1.0}; //<--
}

이렇게 Point타입으로 a란 변수를 만들면서 해당하는 값을 바로 넣어주는 방법을 사용할 수 있으며 이 방법을 사용할 때에는 해당 구조체의 멤버변수 순서와 같은 차례로 초기값을 넣어야 한다.

 구조체 변수를 먼저 선언하고 나중에 필드를 초기화시키는 방법도 있다. 같은 예를 들면 다음과 같다.


ex08-02

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

int main(int argc, char **argv) {
   Point a;
   a.x = 1.0; //<--
   a.y = 1.0; //<--
}

여기서 a.x는 a라는 구조체 변수의 필드 x를 나타낸다. a.y는 필드 y를 나타낸다. 이와 같이 구조체 변수의 필드는 점(.)으로 구분하여 접근한다.


 다른 예로 Person이라는 구조체를 작성해 보자. 필드로는 나이와 키 그리고 이름 정보를 가지고 있어야 한다..


ex08-03.c
#include <stdio.h>

typedef struct {
char strName[10];
int iAge;
float fHeight;
} Person;

int main(int argc, char **argv) {
Person park = {"salesio", 45, 171.5};
Person jang = {"sophia", 45, 165.0};
printf("name:%s, age:%d, height:%.1f\n",
             park.strName, park.iAge, park.fHeight);
printf("name:%s, age:%d, height:%.1f\n",
             jang.strName, jang.iAge, jang.fHeight);
}
실행 결과
name:salesio, age:45, height:171.5
name:sophia, age:45, height:165.0

이 예에서 Person구조체의 필드는 세 개로 strName, iAge, fHeight 이고 각각 문자열 변수, 정수형 변수, 실수형 변수이다. park과 jang이라는 Person 구조체 변수를 생성한 뒤 각각의 필드를 출력하는 예제이다.


   같은 구조체형이라면 대입연산자 =를 이용해서 모든 멤버변수의 값을 복사할 수 있다. 즉, 다른 구조체 변수의 필드값으로 새로운 구조체 변수의 필드를 초기화할 수 있다. 앞에서 예를 든 Point 구조체를 이용하여 예를 들어보자.


ex08-04.c

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

int main(int argc, char **argv) {
Point a = {1.1, 1.2};
Point b = a; // a를 이용하여 b를 초기화
Point c = b; // b를 이용하여 c를 초기화
c.y = 2.0;
printf("a = {%f, %f}\n", a.x, a.y);
printf("b = {%f, %f}\n", b.x, b.y);
printf("c = {%f, %f}\n", c.x, c.y);
}

실행 결과

a = {1.100000, 1.200000}
b = {1.100000, 1.200000}
c = {1.100000, 2.000000}

위에서 Point변수 c는 필드 y가 2.0으로 변경되었으며 출력 결과에 그것이 반영되어 있음을 알 수 있다.


Posted by 살레시오
,

8.1 구조체 정의     [gdoc]     [smts]

 지금까지 C언어가 제공하는 여러 타입의 데이터를 써왔다. char, int, float 등의 기본 자료형  변수에는 하나의 데이터만 담을 수 있다. 어떤 대상이 여러 종류의 데이터를 가져야 하는 경우에는 구조체를 사용하는데 구조체는 단일 변수들을 묶어서 하나의 이름으로 관리할 수 있는 방법을 제공한다. 예를 들어 어떤 회사원의 정보를 저장하려면 이름도 필요하고 생년월일이나 주소, 사번 등등 많은 요소가 그 한사람에 관련된 정보가 될 것이다. 이들 요소를 모두 따로 만들어도 나타내는 일이 가능은 하지만 한 이름으로 모든 요소를 관리하면 효율적일 것이다. 즉, 구조체는 간단히 말해서 변수들의 모임이라고 할 수 있다. 변수들의 모임이라는 점에서 배열과 유사한 점이 있지만 배열은 같은 형의 데이터들의 모임이고 구조체는 서로 다른 형의 데이터들의 모임이라고 생각하면 된다.


 예를 들어 점의 좌표 정보를 갖고 있는 구조체를 작성해 보자. 좌표는 x값과 y값을 가진다. 구조체는 struct 이라는 키워드를 이용하여 선언한다.


struct {
   double x;
   double y;
};

이것은 double형 변수 x와 double형 변수 y를 갖는 구조체를 선언한 것이다. x와 y를 구조체의 필드(field)라고 한다.


 하지만 이것만으로는 이 구조체를 이용하여 데이터(변수)를 생성할 수 없다. 이 구조체를 이용하여 변수를 생성하려면 이 구조체에 이름을 지정해주어야 한다. 이를 위해서 보통  typedef 명령과 조합하여 구조체를 정의하는 방법이 많이 사용된다. typedef는 전에도 나왔지만 새로운 변수형을 선언하는 명령이다. 다음 예를 보자.


typedef struct {
   double x;
   double y;
} Point;

이와 같이 작성하면 struct {,,,} 구조체를 Point라는 이름으로 정의한 새로운 자료형이 생긴 것과 같이 쓸 수 있다. 그리고 이후로는 Point란 이름으로 변수를 선언할 수 있다.


Point a, b;


이렇게 하면 변수 a와 b는 구조체인 Point 변수이며 각각 별도의 필드 x와 y를 갖는다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

8.3 구조체를 함수의 인자로 넘기기  (0) 2016.04.15
8.2 구조체 필드의 초기화  (0) 2016.04.15
6.5 문자열과 포인터  (0) 2016.04.15
6.4 배열과 포인터  (0) 2016.04.15
6.1 포인터 개요  (0) 2016.04.15
Posted by 살레시오
,

6.5 문자열과 포인터     [doc]     [smts]

 문자열의 이름은 사실은 포인터로서 문자열의 첫 문자가 저장되는 주소값(이것을 base address라고 한다.)을 가진다. 문자열은 다음과 같이 정의할 수 있다.


char str[6] = {‘h’,’e’,’l’,’l’,’o’,’\0’}; // 문자 배열

char str[] = “hello”; //(1) 초기화할 경우 일차 배열의 크기를 생략할 수 있다.

char *str = “hello”; //(2) 윗 줄과 완전히 동일하다.


위의 예에서 (1)과 (2)는 동일하며 str 이라는 문자열 이름은 “hello” 문자열의 첫 문자 ‘h’가 저장된 메모리의 주소이다. 따라서 다음과 같은 것들이 가능하다.


str[0] 은 *(str+0) 와 같고(혹은 *str) 문자 ‘h’이다.

str[1] 은 *(str+1) 와 같고 문자 ‘h’이다.

str[2] 은 *(str+2) 와 같고 문자 ‘e’이다.

….

str[4] 은 *(str+4) 와 같고 문자 ‘o’이다.

str[5] 은 *(str+5) 와 같고 널문자(‘\0’)’이다.


따라서 다음과 같은 연산도 가능하다.


char ca = *str; // char ca = str[0] 과 같다.

str[0] = ‘H’; // 첫 문자를 대문자 ‘H’로 바꾼다.

printf(“%s”, str); // “hello” 가 출력된다.

printf(“%s”, str+1); // “ello” 가 출력된다.


문자열변수에 다른 변수를 대입하는 것도 물론 가능하다.


char *s1=”Hello world.”, *s2;

s2 = s1+6;

printf(“%s”, s2);


이 프로그램을 실행시키면 “world”라고 출력될 것이다. 포인터 s2 는 ‘w’를 가리키고 있기 때문이다.



H

e

l

l

o


w

o

r

l

d

\0

offset

0

1

2

3

4

5

6

7

8

9

10

11


이와 같이 문자열 변수는 사실  char형 포인터이고 문자열의 첫 문자가 저장된 곳의 주소라는 사실을 잘 이해해야 한다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

8.2 구조체 필드의 초기화  (0) 2016.04.15
8.1 구조체의 정의  (0) 2016.04.15
6.4 배열과 포인터  (0) 2016.04.15
6.1 포인터 개요  (0) 2016.04.15
5장 연습문제  (0) 2016.04.11
Posted by 살레시오
,

6.4 배열과 포인터     [doc]     [smts]

 포인터와 배열은 깊은 관계가 있는데 사실 배열의 이름이 바로 포인터이다. 다음 예를 보자.


0603-01.c

#include <stdio.h>

int main()

{

  int iaa[] = {11,22,33,44,55};

  int ib = 4;

  printf("iaa : %p\n", iaa); //(1)

  printf("*iaa : %d\n", *iaa); //(2)

  printf("*(iaa+ib) : %d\n", *(iaa+ib)); //(3)

  printf("iaa[ib] : %d\n", iaa[ib]); //(4)

}


iaa : 0028ff08

*iaa : 11

*(iaa+ib) : 55

iaa[ib] : 55


이 예에서 (1)의 결과 를 보면 포인터(주소)값이 찍히는 것을 알 수 있으며 (2), (3), (4)의 결과를 보면 배열명은 내부적으로 배열의 첫 번째 요소의 포인터(주소)임을 알 수 있다. 그래서 배열의 첫 번째 요소를 참조하는 다음 표현식은 모두 같은 것들이다.


  • *iaa

  • *(iaa + 0)

  • iaaa[0]


마찬가지로 배열의 5번째 요소는


  • iaa[5]

  • *(iaa+5)


로 표현할 수 있다.

또 다른 예를 보자.


0603-02.c

#include <stdio.h>

int main() {

   int iaa[] = {11,22,33,44,55};

   int *ip = iaa;

   for(int k=0; k<5; k++){

       printf("iaa[%d]:%d, ", k, ip[k]);  //(1)

   }

   printf("\n");


   for(int k=0; k<5; k++){

       printf("iaa[%d]:%d, ", k, *(ip+k)); //(2)

   }

   printf("\n");


   for(int k=0; k<5; k++){

       printf("iaa[%d]:%d, ", k, *(ip++)); //(3)

   }

}


iaa[0]:11, iaa[1]:22, iaa[2]:33, iaa[3]:44, iaa[4]:55,

iaa[0]:11, iaa[1]:22, iaa[2]:33, iaa[3]:44, iaa[4]:55,

iaa[0]:11, iaa[1]:22, iaa[2]:33, iaa[3]:44, iaa[4]:55,


여기서 (1)과 (2)는 완전히 같은 코드이다. 즉 ip[k] 와 *(ip+k)는 완전히 동일한 표현식이다. 하지만 (3)에서는 앞의 경우들과 달리 ip값이 직접 증가하여 변한다는 점이 다르다. 하지만 배열명에 정수를 더하거나 뺄 수 없다. 즉 iaa++, --iaa 과 같은 표현식은 에러를 발생시킨다. 배열 포인터를 직접 증감시킬 수 없으므로 다른 포인터를 변열 명으로 초기화 한 후 그 포인터를 조작해야 한다.


 배열과 포인터의 차이점을 요약하면 다음과 같다.


  • 배열은 메모리가 자동으로 생성되지만 포인터는 메모리를 할당해야 한다.

  • 배열은 주소 이동이 불가능하지만 포인터는 가능하다.

  • 배열은 크기가 ‘데이터형×배열크기’ 이지만 포인터는 2 또는 4바이트이다.


‘배열명은 첫 번째 요소의 포인터값을 갖는 상수’라는 사실은 확실히 알아두어야 한다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

8.1 구조체의 정의  (0) 2016.04.15
6.5 문자열과 포인터  (0) 2016.04.15
6.1 포인터 개요  (0) 2016.04.15
5장 연습문제  (0) 2016.04.11
C언어의 문자열  (0) 2016.04.11
Posted by 살레시오
,