C++ 포인터 변수

2014.06.15 00:29

엘카 조회 수:414

참고 문서  
 포인터 변수란?  
    - 다른 객체의 메모리 주소를 저장하는 변수. 
     - 선언되는 자료형(data type) 단위로 증가되거나 감소될 수 있다. 
"포인터 변수는 어떤 객체가 할당 받은 메모리의 선두주소를 포인터 변수가  
  대입 받아 이를 활용할 수 있게 한다." 

선언 형식 

자료형  *변수이름; 

자료형  *변수이름1, *변수이름2, ... , *변수이름n; 

선언 예 

int  *ip;   char  *cp;   float  *fp;   double  *dp;   

포인터 변수는 32-bit 운영체제는 4-byte, 64-bit 운영체제는 8-byte 크기를 할당. 

 & (주소 연산자) : 변수에 할당된 메모리의 시작주소를 의미하는 연산자 

 * (포인터 연산자) : 포인터 변수가 가리키는 곳의 내용을 참조하는 연산자  


#include <stdio.h> 
 
int main(void) 
{ 
  int num=98;     
  double d , *dp;    /* 포인터 변수 dp 선언 */ 
 
  printf("%d, %c, %p \n",num,num,&num); 
  d=10.3;    
  dp=&d;      /* 포인터 변수에 &연산자를 이용하여 주소를 할당 받음 */ 
  printf("value : %lf, address : %p \n", d, &d); 
  printf("value : %lf, address : %p, %p \n", *dp, dp, &dp);    
  printf("sizeof : %d %d \n",sizeof(d),sizeof(dp)); 
             /* 포인터 변수는 타입에 관계없이 4-byte를 할당 */ 
  return 0; 
} 

포인터 변수의 자료형 

    - 포인터 변수 선언 시 주의할 점은 포인터 변수의 자료형이다. 

    - 포인터 변수의 자료형은 포인터 변수가 가리키는 번지로 가서 몇 byte 단위로 데이터를 읽어 오게 

      하는 가에 대한 정보를 나타낸다. 

    - 포인터 변수의 자료형(data type)은 포인터 변수가 접근하는 데이터의 자료형과 같아야 한다. 


변수와 포인터 변수의 차이점 

 

변수  

 포인터 변수 

 선언  

 double d; 

 double *dp; 

 메모리 할당 

 8 

 4 (32-bit 운영체제) 

 저장 

 실수형 데이터 

 메모리 주소 

 값 접근 

 d (변수명 사용) 

 *dp (저장된 주소를 참조) 

 값의 접근방식 

 직접 접근 

 간접 접근 


포인터 변수를 사용할 때 알아야 할 5가지 규칙 

  1. 포인터 변수는 *변수명으로 선언하여 컴파일러에게 포인터 변수임을 알린다. 
  2. 포인터 변수의 자료형은 자신에게 주소를 대입할 변수의 자료형과 같아야 한다. 
  3. 포인터 변수는 선언만으로는 주소를 할당 받지 못하므로 다시 변수의 주소를 할당 받아야 한다. (일반적으로 변수의 주소를 지정하는 데는 "&" 연산자를 사용한다.) 
  4. 실행문에서의 *변수명은 자신이 보관하고 있는 주소의 데이터(값)에 접근하게 된다.  
    포인터 변수는 값을 저장하는 것이 아니라, 값이 저장된 어떤 객체의 선두주소를 가지므로  * 연산자를 통하여 값에 대한 접근을 하게 된다.  이것을 간접 접근이라고 한다. 
  5. (5) 모든 포인터 변수는 자료형과 무관하게 4-byte의 크기를 할당을 보장 받는다. 


#include <stdio.h> 
 
int main(void) 
{ 
  char ch,*cp;    
  int num,*ip;    
  float fnum,*fp;    
  double dnum,*dp;    
 
  ch='A'; num=90; fnum=0.123; dnum=0.123456;    
  cp=&ch;    
  ip= #   
  fp= &fnum;   
  dp=&dnum; 
  printf("%p %p %p %p\n",&ch, &num, &fnum, &dnum); 
  printf("%p %p %p %p\n",&cp, &ip,      &fp,      &dp); 
 
 printf("%5c %5d %10f%  10lf \n",ch,  num,  fnum,  dnum);  
  printf("%5c %5d %10f% 10lf \n",*cp, *ip,   *fp,    *dp);    
printf("%3d %3d %3d %3d     \n",sizeof(ch),   sizeof(num), 
                                                              sizeof(fnum),  sizeof(dnum));    
  printf("%3d %3d %3d %3d   \n",sizeof(cp),   sizeof(ip), 
                            sizeof(fp),    sizeof(dp));    
 
  return 0; 
} 


번호 제목 날짜 조회 수
43 구조체 포인터 2014.06.15 931
42 구조체의 선언과 데이터 입·출력 2014.06.15 3084
41 함수 포인터 2014.06.15 447
40 배열과 포인터 2014.06.15 406
39 포인터 연산 2014.06.15 384
» 포인터 변수 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