[포인터와 배열의 관계]
배열 이름은 포인터이고, 그 값은 배열의 첫 번째 원소의 주소값이다. 포인터에 배열의 원소를 지정하는 첨자를 사용가능하다. 배열 이름은 고정된 주소를 갖는 상수포인터이다.
ex)
int array[3] = {1,2,3};
array = array+1; //오류
array++; //오류
//배열의 주소값은 변경이 불가능하다.
예제
#include <stdio.h>
#define N 100
int main(void){
int a[N], i, *p; //a: int형 포인터, a[0]의 주소
p = a; //p = &a[0];
p = a+i; //a+i: a[0]에서 i번째 떨어진 원소 위치(주소)이다.
*(a+i) = 10;
p[i]=10; //p[i] == *(p+i)
*(p+i) = 10;
a=&i; //오류 // a는 상수 포인터
}
int ary[3] = {1,2,3};
int *p = ary;
//ary[0], *(ary+0), p[0], *(p+0)은 모두 동일하다.
//ary[1], *(ary+1), p[1], *(p+1)은 모두 동일하다.
//ary[2], *(ary+2), p[2], *(p+2)은 모두 동일하다.
[2차원 배열과 포인터]
:2차원 배열도 인덱스 하나를 제거하면 포인터가 된다.
int b[3][5];
-b[i]: int형 포인터이며 &b[i][0]와 같은 값이다.
-b[i]+j : &b[i][j]
2차원 배열에서 인덱스 2개를 제거하면 배열 포인터가 된다.
int b[3][5];
-b: int[5] 형 포인터
-b+i: &b[i][0]부터 int형 원소 5개 포인트한다.
[ b[i][j]의 다양한 표기 방법]
#include <stdio.h>
#define N 100
int b[N][N];
-b[i][j]
-*(b[i]+j)
-*(*(b+i)+j)
-(*(b+i))[j]
[배열과 함수]
[배열을 매개변수로 갖는 함수]
: 배열 매개변수는 포인터이다.
int grade_sum(int [], int);
int main(void){
int grade[10];
int sum = grade_sum2(grade,10); //배열의 이름은 배열의 시작 주소를 나타낸다.
return 0;
}
int grade_sum2(int gr[], int size) { //gr은 main에서 전송한 배열의 시작주소를 받는 포인터이다.
int sum, i;
for(sum=0; i=0; i<size; i++)
sum+=gr[i];
return sum;
}
/*
다음 함수와 같은 의미의 함수이다.
int new_grade_sum2(int *gr, int size) {
int sum, i;
for(sum=0; i=0; i<size; i++)
sum = *(gr+i);
return sum;
}
*/
-대응 인자는 주소 값이면 된다.
#define N 100
int i , a[N], sum;
sum = grade_sum2(a,N);
//sum = a[0] + a[1] + ... a[99];
sum = grade_sum2(&a[5],10);
//sum = a[5] + a[1] + ... a[14];
sum = grade_sum2(&i,1);
//sum = i;
[문자열과 포인터]
[문자 배열과 문자 포인터 차이]
char *p = "abcde";
char s[] = "abcde";
printf( "%c %c %c %c", p[0], *p, s[0], *s); //a a a a
printf( "%s %s", p, s); //abcde abcde //시작 주소부터 NULL값 이전까지 출력
printf( "%s %s", p+1, s+1); // bcde bcde
#define N 20
char name[N] = ""; //NULL값 저장 // 배열의 모든 원소가 NULL이다.
char *name_p;
scanf("%s", name);
scanf("%s", name_p); //오류
//name(배열)에는 scanf를 실행했을 때 할당된 메모리로 입력이 가능하지만,
name_p(포인터)에는 쓰레기 주소 값(garbage value)이 있으며, 해당 주소에 메모리가 할당이 되지 않게 되며, 입력을 할 수 없다.
'c언어' 카테고리의 다른 글
[C언어] 비트 수준 접근 (0) | 2022.10.23 |
---|---|
[C언어] 공용체(union) / 열거형 (0) | 2022.10.12 |
[C언어] 동적 메모리 할당 (0) | 2022.09.07 |
[C언어]포인터와 함수 (0) | 2022.09.07 |
[C언어] 포인터 기본 (0) | 2022.09.06 |