C++ 배열과 포인터

2014.06.15 06:37

엘카 조회 수:406

참고 문서  

 1차원 배열 

 포인터 변수에 1차원 배열의 메모리 주소를 할당하는 예 

int num[5] = {10, 20, 30, 40, 50}; 

int *ptr;    /* 포인터 변수 ptr의 선언 */ 

ptr = num;   /* 포인터 변수에 배열의 선두 메모리 주소를 할당 */ 


1차원 배열과 포인터와의 관계 

#include <stdio.h> 
 
int main(void) 
{ 
  int num[5]={10,20,30,40,50};   
  int *ptr;    
 
  ptr = num;    
 
  printf("%p\t %p \t %p \n", num, &num[0], ptr);  
  
 
 
 
  printf("%d, %d, %d \n", num[0], num[1], num[2]);    
  printf("%d, %d, %d \n", ptr[0], ptr[1], ptr[2]);    
  printf("%d, %d, %d \n", *(ptr+0), *(ptr+1), *(ptr+2));    
  printf("%d, %d, %d \n", *(num+0), *(num+1), *(num+2));      
  printf("%d, %d, %d \n ", *ptr+0, *ptr+1, *ptr+2);  //값의 연산  
 
  return 0;  
} 
// ※ 위 예제에서 num[i]와 *(num+i), *(ptr+i)는 같은 내용이다. 


1차원 배열과 포인터와의 관계 

#include <stdio.h> 
 
int main(void) 
{ 
   
  int *ptr, i;    
  int count[5]={10,20,30,40,50};   
 
  ptr = count;    
  for(i=0;i<5;i++)     
     printf("%d, ", *ptr++); // *ptr을 먼저 %d에 나타낸후 ++연산수행     
  printf("\n"); 
 
  /* 다음과 같이 작성하면 오류가 된다. 
     for(i=0;i<5;i++)     
        printf("%d, ", *count++);   
        // count는 배열의 시작주소를 가지는 상수이므로 값의 변경이 불가능 
     printf("\n");                    
  */     
  return 0;   
} 



 2차원 배열과 포인터의 관계 

int  num[4][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; 

int  *ptr1; 

ptr1 = num; 


 2차원 배열과 포인터의 관계 

#include <stdio.h> 
 
int main(void) 
{ 
 
  int num[4][3]  
     = { 1,2,3,4,5,6,7,8,9,10,11,12 };   
  int *ptr1, i, j;   
 
  for (i=0; i<4; i++)           
  {     
     for(j=0; j<3; j++)       
        printf("%p, %d \t",&num[i][j], num[i][j]);      
     printf("\n");   
  }   
  printf("\n");    
 
  ptr1 = &num[0][0];    
  printf("&num[0][0] : %p, ptr1 : %p \n", &num[0][0], ptr1);
 
 for (i=0; i<4; i++)           
  {     
     for(j=0; j<3; j++)     
     {       
        printf("%p, %d\t",ptr1, *ptr1++); /* 포인터 변수로 접근 */ 
   
     }      
     printf("\n");   
  }   
  printf("\n");   
 
  return 0; 
}   

 포인터 배열 

   - 포인터 자료형의 데이터, 즉 메모리의 주소(동일한 자료형에 대한 포인터)들을 연속된 

      메모리 공간에 모아 놓은 것. 

    - 포인터 배열의 원소 각각은 주소를 보관하는 포인터 변수가 된다. 

    - 포인터 배열의 원소 각각은 선언 자료형과 상관 없이 4 bytes의 크기(32비트 운영체제  

      기준)를 가진다. 

    - 포인터 배열의 선언 자료형은 포인터 배열의 원소가 가리키는 자료의 자료형을 의미 


포인터 배열 선언 형식 

자료형  *변수이름[크기]; 

자료형  *변수이름1[크기], *변수이름2[크기], ... , *변수이름n[크기]; 


포인터 배열의  선언 예 

char  *myargv[3];     /* 문자형 포인터 배열 선언 */ 

int   *temp[3];       /* 정수형 포인터 배열 선언 */ 



 문자열 포인터 배열의 이해 

#include <stdio.h> 
 
int main(void) 
{ 
  // 2차원 문자 배열   
  char names[5][20]  
    = {"kim", "kim weon sun", "sun", "lee", "park"};   
  // 포인터 배열   
  char *p_names[5]  
    = {"kim", "kim weon sun", "sun", "lee", "park"};   
  int i;   
   
  printf("문자배열 \t \t \t 포인터배열 \n");   
  for( i=0; i<5; i++)      
     printf("%d. %p, %-10s \t %p, %-10s \n",    
                   i,  names[i],  names[i],  p_names[i],  p_names[i]); 
  return 0; 
} 


번호 제목 날짜 조회 수
43 구조체 포인터 2014.06.15 931
42 구조체의 선언과 데이터 입·출력 2014.06.15 3084
41 함수 포인터 2014.06.15 447
» 배열과 포인터 2014.06.15 406
39 포인터 연산 2014.06.15 384
38 포인터 변수 2014.06.15 414
37 데이터 정렬 2014.06.15 424
36 배열 초기화 2014.06.14 630
35 2차원 배열 2014.06.14 670
34 문자열 처리 함수 2014.06.14 412
33 문자열 입출력 함수 2014.06.14 442
32 접근 수정자 2014.06.14 824
31 전역 변수 2014.06.14 308
30 지역 변수(local variable) 2014.06.14 295
29 변수와 메모리 저장 위치 2014.06.14 428
28 비트 연산자 2014.06.14 288
27 관계 연산자와 논리 연산자 2014.06.14 472
26 증감 연산자 2014.06.14 319
25 printf() 함수의 형식 지정자 2014.06.14 7522
24 열거 형 변수의 이해 2014.06.14 465