c언어

[C언어] 포인터와 배열

kidmillionaire1998 2022. 9. 7. 14:58

[포인터와 배열의 관계] 

배열 이름은 포인터이고, 그 값은 배열의 첫 번째 원소의 주소값이다. 포인터에 배열의 원소를 지정하는 첨자를 사용가능하다. 배열 이름은 고정된 주소를 갖는 상수포인터이다. 

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