31. 포인터 배열(1)
32. 포인터 배열(2)
33. 포인터 배열(3)
34. 포인터 배열(4)
35. 구조체
31. 포인터 배열(1)
ㅁ 포인터 배열
- 포인터 변수인데 배열화 시킨 것.
- 배열 형태인데 그 배열의 각각의 요소에 주소값이 들어가는 것.
- 배열의 요소가 포인터(메모리주소)로 이루어진 것.
char a[3]; <- 이렇게 선언하면 a b c 이렇게 들어감
char *a[3]; <- 이렇게 포인터변수를 배열로 만들면 a b c가 아니라 주소값이 들어감
ㅁ 일반적인 배열
- a에는 100번지가 들어감.
- %s는 문자열(두 개 이상의 문자 결합구조) 출력. %c는 단일문자 출력.
- c언어의 문자 자료형은 메모리 한 칸에 하나의 문자만 삽입될 수 있음.
- %c는 char형을 요구, %s는 char *형을 요구함.
%s는 주소값을 받아 문자열을 끝까지 출력함.
- a라는 주소값(100번지)을 받아서 맨 끝의 null문자를 만날때까지 abc를 출력함.
ㅁ 포인터 변수에 문자열 넣기
- str에 100번지가 들어감.
- 포인터라는 것은 메모리의 주소값을 받는거니까.
ㅁ 포인터 배열
- student라는 포인터 변수를 만드는데 3개의 공간을 가진 배열로 만든다.
- 저 각각의 배열 요소에는 주소값이 들어가게 된다.
- 20, 30, 40이라는 주소값이 들어감.
ㅁ 문제
- c+1은 101번지.
- %s는 주소값을 받아 문자열을 끝까지 출력함.
- 101번지의 실제값에는 30이라는 주소값이 들어가 있음.
- 첫번째 a는 20번지, 그 다음 a는 21번지, 그 다음 a는 22번지임. aaa가 가지는 첫번째 주소값 20번지를 0번요소에 저장하게 되고.
ㅁ 포인터 배열, 배열 포인터
- 데이터타입 (*포인터이름) [배열크기];
int (*ptr) [3] <- 이게 배열 포인터
- int *ptr [3] <- 괄호 안들어가면 포인터 배열이다. 괄호들어가면 배열포인터고.
32. 포인터 배열(2)
ㅁ 문제
- array1에는 20(100번지)과 50(101번지)이라는 주소값이 들어감
- %s. 문자열을 출력하기 위해 주소값을 받는다.
array1의 0번지. 20이다. 왜? 배열 a[0]은 그 배열의 첫번째 값이니까. 주소값이 아니라.
+5하면 25번지가 됨. m이 아니라 25번지부터 다 출력한다. morning 출력.
- 50+6이라는 주소값의 실제 값은 u. u출력. %c는 글자 하나 출력.
- 출력.
morning
u
33. 포인터 배열(3)
ㅁ 문제
- 이차원배열로 선언했는데 a[0], a[1]. <- 2차원 배열에선 행으로 쓰나?
행을 대표하는 a의 0번지 같은 경우에는 100번지부터 시작했다하면 100번지가 들어간다.
a의 1번지 행의 대표주소값은 103번지가 된다.
- 포인터배열이라서 a[0]을 넣어도 주소값인 100으로 넣는건지 2차원배열에선 그냥 a[0]=100인건지 모르겠.
- 그리고 b는 임의로 200번지, 201번지.
- 답. 103이 아니고 1
- 답. 104가 아니고 -10
- 답. 14
- 출력결과. 1 -10 14
34. 포인터 배열(4)
ㅁ 문제
24+12+1 = 37
- 포인터 배열에는 주소값만 들어갈 수 있다.
- 20, 30, 40이 들어간다.
- printf다음 %d를 보면 정수 하나 출력한다.
- **arr. 100번지의 값은 20번지. 20번지의 값 12.
- 답은 37
35. 구조체
ㅁ 구조체
- 구조를 만드는 언어
- 사람을 표현한다 치면 name, age, height 등의 변수들을 각각 선언하고, 묶어서 사람이라는 하나의 변수를 만듦. 사용자 정의 변수.
- 여러 변수들을 모아서, 하나의 객체를 구성할 때 사용하는 사용자 정의 타입 객체
ㅁ 구조체 구성
struct 구조체명
{
멤버변수 1; <- 구조체를 구성하는 변수들이 들어감.
멤버변수 2;
};
ㅁ 구조체 정의 및 사용
[정의]
struct person
{
char *name; <- name이라는 포인터 변수 캐릭터가 있다. 여기엔 문자열을 담을 수 있다.
int age;
};
[사용]
struct person user1; <- 구조체 변수를 하나 만들건데 person이라는 구조체인데 이름은 user1.
이러면 user1이라는 변수가 하나 생겼는데 이 안에 name과 age라는 변수가 있다.
user1.name = "h user"; <- user1이 가리키고 있는 name이란 공간 안에 h user를 집어넣는다.
printf("%s", user1.name); <- %s니까 문자열 출력.
ㅁ 구조체 정의 및 사용2 (생성을 같이함)
struct person
{
char *name;
int age;
} test; <- test라는 인스턴스가 바로 생성됨.
test.name = "h user";
test.age = 40;
printf("%s:%d", test.name, test.age);
ㅁ 구조체 정의 및 사용3 (포인터에 담는 경우)
struct person
{
char *name;
int age;
};
struct person *p; <- person이라는 구조체를 만들고, 포인터 변수로 만듦.
p -> name = "test_2"; <- 포인터 변수로 만들었을 때는 .이 아닌 화살표를 쓴다. ->
p -> age = 40;
printf("%s:%d", p->name, p->age);
ㅁ 문제
- list라는 구조체를 만드는데 여기엔 포인터변수 fp가 있다. 여기엔 주소값이 담긴다. 정수형 공간을 가리키는 주소값.
- p = &data;
data가 100번지를 가리키고 있다고 가정하고 p는 110번지를 가리키고 있다고 가정.
근데 이제 p는 110번지의 구조체를 가리키는게 아니고 100번지의 구조체를 가리키게 됨.
data와 포인터변수 p 모두 같은 구조체를 가리키게 됨.
- p->fp = x+1;
fp는 201번지가 됨. (data는 100번지를 그대로 가리키고 있고, fp는 201번지를 가리킴)
- *(++p->fp)
p->fp가 하나다. p를 ++시키는게 아님.
fp는 202번지가 됨.
- 답은 300
- 구조체를 이용하는 방법이 두가지,
일반변수처럼, 포인터 변수처럼 이렇게 이용할 수 있는데,
data 이런식으로 일반 변수처럼 이용하게 되면, data.fp 이렇게 사용이 가능하고,
*p 처럼 이용하게 되면, p->fp 이렇게 사용하는 차이점만 있어요..
그리고 fp 는 구조체 안에 들어가 있어서 p 가 fp 를 사용할 수가 있게 되요..
구조체가 여러 변수들을 같이 참조할 수 있는 성질이 있는거지요~~
'깨알 c언어' 카테고리의 다른 글
깨알 c언어 ch.41 ~ 45 (0) | 2024.03.10 |
---|---|
깨알 c언어 ch.36 ~ 40 (0) | 2024.03.09 |
깨알 c언어 ch.26 ~ 30 (0) | 2024.03.08 |
깨알 c언어 ch.21 ~ 25 (0) | 2024.02.22 |
깨알 c언어 ch.16 ~ 20 (0) | 2024.02.22 |