[C언어] 배열 표현 하기
- 카테고리 없음
- 2020. 11. 24.
주소 표현식
* 을 통해서 표현한다.
에스터리스크(*) 를 구분할 때는 값인지, 주소 인지부터 파악하는게 우선 순위다.
1. 주소와 값을 구분하는 방법
1-1. 선언할 것을 기준으로 [], * 갯수가 부족하면 => address
1-2. 선언한 것을 기준으로 [], * 갯수가 동일하면 => value
2. 주소가 어디를 표기하는지 구분 하는 방법
2-1. [] , * 1개 부족 : 1차원 주소
2-2. [] , * 2개 부족 : 2차원 주소
★★★
3. 주소 연산 (위, 1번과 2번을 기준으로 3번을 구분 한다.)
부족한 갯수
1차원 주소 + 1 => 한 요소의 사이즈.
2차원 주소 + 1 => 한 행의 사이즈
3차원 주소 + 1 => 한 면의 사이즈.
4. 첨자( [] )와 에스터리스크의 관계
[] <=> *
배열과 에스터리스크는 서로 다르다.
그러나 서로 주소값을 가졌으므로 호환이 가능하다.
ex
void abc ( int aa[2])
{
}
여기서 매게변수 int aa[2]는 배열이 아니라, 포인터다.
포인터는 배열의 역할도 수행하고 있어서 바로 error가 발생하지는 않는다.
단, 배열처럼 인식하고 사용할 경우 메모리 부족을 겪으므로 조심해야 한다.
==============================================================
복습하기
배열 int a[4] = {4, 3, ,2, 1};
a[0] = &a[0]
=> a라고 사용해도 배열의 첫번째이므로 a[0]을 인식 할 수 있다.
이랬을 때 위의 조건 3번, a를 기준으로 1개가 부족하므로 +1을 하게 될 경우 다음 요소를 가르킨다.
a = a[0]
a+1 = a[1]
a+2 = a[2]
이미 *의 갯수가 있으므로, *a+1을 하게 될 경우 (값+1) 적용 된다.
*a = a[0]
*(a+1) = a[1]
*(a+2) = a[2]
#include<stdio.h>
int main() {
char name[10]; //이름
int score[4] = { 0 }; //국어 영어, 수학, 총점
float avg = 0.f;
int i, j;
// input
scanf("%s", &name); //name
//점수를 4개를 받는다.
for (i = 0; i < 3; i++) {
//scanf("%d", &score[i]);
scanf("%d", &*(score + i));
//총점
//score[3] += score[i];
*(score+3) += *(score + i);
}
////연산
//score[3] = score[0] + score[1] + score[2];
//평균
//avg = score[3] / 3.f;
avg = *(score + 3) / 3.f;
// 출력
// c 언어에서는 항상 주소값이 필요하다.
// 마지막에 항상 null 문자가 들어간다. 그래서 null이 인식이 되면 자동으로 끊긴다.
printf("%s\t", name);
for (i = 0; i < 4; i++)
//점수 출력
//printf("%d\t", score[i]);
printf("%d\t", *(score + i));
//평균 출력
printf("%f\n", avg);
}
천천히 배열을 포인터로 변경 시켰다.
2차원 배열 주소 표현하기
기준 | a[0][0] | a[0][1] | a[1][0] | a[1][1] | 사용 여부 |
a[0][0] | a[0][0] | a[0][0]+1 | a[0][0]+2 | a[0][0]+3 | |
a | a | a+1 | |||
a[0] | a[0] | a[0]+1 | a[0]+2 | a[0]+3 | x |
a[1] | a[1] | a[1]+1 | |||
*a | *a | *a+1 | *a+2 | *a+3 | x |
*(a+1) | *(a+1)+1 |
2차원 배열 값 표현하기
기준 | a[0][0] | a[0][1] | a[1][0] | a[1][1] | 사용 여부 |
a[0][0] | a[0][0] | a[0][0]+1 | a[0][0]+2 | a[0][0]+3 | |
*a | *a | *(a+1) | |||
a[0] | *(a[0]) | *(a[0]+1) | *(a[0]+2) | *(a[0]+3) | x |
a[1] | *a[1] | *(a[1]+1) | |||
**a | *(*a) | *(*a+1) | *(*a+2) | *(*a+3) | x |
**(a+1) | *(*(a+1)+1) |
3차원 배열 주소 나타내기
a[0][0][0] | a[0][0][1] | a[0][1][0] | a[0][1][1] | a[1][0][0] | a[1][0][1] | a[1][1][0] | a[1][1][1] | |
a[0][0] | a[0][0] | a[0][1] | a[0][1]+1 | a[0][1]+1 | a[1][0] | a[1][0]+1 | a[1][1] | a[1][1]+1 |
a[0] | a[0] | x | a[0]+1 | x | a[1] | x | a[1]+1 | x |
a | a | |||||||
*a | *a | x | *a+1 | x | *(a+1) | x | *(a+1)+1 | x |
*a[0] | *a[0] | *a[0]+1 | *(a[0]+1) | *(a[0]+1)+1 | *a[1] | *a[1]+1 | *(a[1]+1) | *(a[1]+1)+1 |
**a | **a | ***a+1 | *(*a+1) | *(*a+1)+1 | **(a+1) | **(a+1)+1 | *(*(a+1)+1) | *(*(a+1)+1)+1 |
결과값은 앞에 * 하나 더 추가해주면 된다.
배열을 에스터리스크로 변형해보자
#include<stdio.h>
int main() {
char name[3][10]; //이름
int score[3][4] = { 0 }; //국어 영어, 수학, 총점
float avg[3] = { 0.f };
int i, j;
//3명이 되었으므로 for 추가
for (j = 0; j < 3; j++) {
// input
//scanf("%s", &name[j]); //name
scanf("%s", *(name+j)); //name
//점수를 4개를 받는다.
for (i = 0; i < 3; i++) {
//scanf("%d", &score[j][i])
scanf("%d", *(score+j)+i)
;
//총점
//score[j][3] += score[j][i];
*(*(score + j) + 3) += *(*(score + j) + i);
}
////연산
//score[3] = score[0] + score[1] + score[2];
//평균
//avg[j] = score[j][3] / 3.f;
*(avg+j) = *(*(score+j)+3) / 3.f;
}
// 출력
// c 언어에서는 항상 주소값이 필요하다.
// 마지막에 항상 null 문자가 들어간다. 그래서 null이 인식이 되면 자동으로 끊긴다.
for (j = 0; j < 3; j++) {
//printf("%s\t", name[j]);
printf("%s\t", *(name+j));
for (i = 0; i < 4; i++)
//점수 출력
//printf("%d\t", score[j][i]);
printf("%d\t", *(*(score+j)+i));
//평균 출력
//printf("%f\n", avg[j]);
printf("%f\n", *(avg+j));
}
}
반응형