'포인터'에 해당되는 글 6건

  1. 2010.05.25 문자열 포인터
  2. 2010.05.25 배열포인터의 특징
  3. 2010.05.20 2차원 배열포인터와 대상체
  4. 2010.05.19 배열과 포인터
  5. 2010.05.19 포인터란?
  6. 2010.01.24 This 포인터

char형 포인터를 선언하였다.
문자열에 대한 간단한 이해를 해보자.

char *temp_p;
char temp;

 temp_p =  'a'; //'a'는 문자로서 아스키코드로 숫자화되있다. 이것을 temp_p에 반환하는것은 말이안된다. temp_p는 주소만을 받는 포인터이다.
 temp_p = "a";

 temp = 'a';
 temp = "a"; //문자열을 반환하게되면 첫번째 문자열이 저장된 첫번째 위치의 주소값이 반환되는데 temp는 char형이기 때문에 값을 받을 수 없다.



'프로그래밍 기초 > C포인터' 카테고리의 다른 글

2차원 포인터 배열  (0) 2010.05.25
배열포인터의 특징  (0) 2010.05.25
2차원 배열포인터와 대상체  (0) 2010.05.20
배열과 포인터  (0) 2010.05.19
포인터란?  (0) 2010.05.19
Posted by 아몰라
이런식으로 접근해서 2차원배열을 포인터를 이용해 사용할 수도 있다.

 int *temp;
 int temp_array[3][2] = {{0,1},{3,5},{7,9}};
 
temp = temp_array;      //temp는 4바이트 대상체를 가르킬수 있는 포인터 변수이다. temp_array는 배열명으로서 대상체의 크기가 24인 2차원배열이다. 오류난다.

 temp = &temp_array[0][0]; //&temp_array[0][0]는 2차원배열의 첫번째 주소를 가르키고 대상체가 4바이트이므로 성립한다. 성립한다.



다음은 연산과 연산 후 역참조 할 때의 차이점이다.
int (*temp)[2];
 int temp_array[3][2] = {{0,1},{3,5},{7,9}};
 
 temp = temp_array;
 
 cout<<temp+0<<endl;
 cout<<*(temp+0)<<endl;
 cout<<sizeof(temp+0)<<endl;
 cout<<sizeof(*(temp+0))<<endl;
 cout<<temp+1<<endl; 
 cout<<*(temp+1)<<endl;
 cout<<sizeof(temp+1)<<endl;
 cout<<sizeof(*(temp+1))<<endl;


포인터에서  +1 연산을 하였으므로 8크기만큼 이동한다. (2차원배열포인터이기때문에) 만약 그냥 1차원 포인터였다면 4만큼 이동하였을꺼다. 그리고 *연산을 하게되면 값을 취하게 됐을것이다.
하지만 여기선 *를 하게 됨으로 대상체가 행 전체로 바뀌게되면서 사이즈가 8로 바뀌는것을 볼 수 있다.
(temp+1)은 그냥 주소+정수 해서 연산을해서 주소위치만 바뀌었을뿐 이다. *(temp+1)을 함으로써 대상체가 바뀌게 된다. 즉, temp+1행을 가르키게 된다.
(가르키고 있는 주소는 보는바와 같이 같다. 단, 대상체가 다를뿐)



 포인터 접근순서
int (*temp)[2];
 int temp_array[3][2] = {{0,1},{3,5},{7,9}};
 
 temp = temp_array;
 
 cout<<*(*(temp+2)+1)<<endl;

+2를 함으로 3번째 행에 접근하였고 *연산을 하여서 해당 행을 가르키고있다. +1연산을 하여 해당 행에 2번째 열의 주소에 접근하였고 *연산을 하여 값에 접근하였다. 그래서 9가 출력된다.

'프로그래밍 기초 > C포인터' 카테고리의 다른 글

문자열 포인터  (0) 2010.05.25
2차원 포인터 배열  (0) 2010.05.25
2차원 배열포인터와 대상체  (0) 2010.05.20
배열과 포인터  (0) 2010.05.19
포인터란?  (0) 2010.05.19
Posted by 아몰라

2차원 배열 포인터란 2차원 배열을 담는 포인터이다.

 int temp_array[3][2] = {{0,1},{3,5},{7,9}}; //2차원 배열
int (*temp)[2]; //2차원 배열포인터

temp = temp_array;

2차원 배열은 이렇게 2차원 배열포인터를 이용해서 가르킬수 있다.


아래서는 대상체에 대해서 개념을 이해해보자.
대상체란 말 그대로 가르키는 대상이 무엇이냐인데 아래를 보자.

int (*temp)[2];
 int temp_array[3][2] = {{0,1},{3,5},{7,9}};
 
1. temp = temp_array;
2. temp = temp_array[0];
3. temp = &temp_array[0][0];

위와 같이 실행하게되면 되야 된다고 생각할 수 있지만 1번만 성립된다.
왜냐하면...여기서 대상체에 대한 이해가 필요하다.
우선 1,2,3번은 주소값은 모두 같다.

1번은 temp는 2개의 대상체를 가진 값을 가르킬수 있는 포인터이고 temp_array는 2차원 배열의 배열명이기 때문에 당연히 성립한다.

문제는 2번과 3번인데

2번은 temp_array[0]같은 경우 행을 대표하는 것으로서 대상 체가 1번과 같이 배열 전체가 아니라 해당 행 전체인 것이다. 그러므로 temp가 가르킬 수 없는 것이다.

3번 같은 경우도 비슷하다. &temp_array[0][0]는  대상체가 temp_array[0][0]여서 불가능하다.




이번엔 더 분명하게 대상체에 대해서 sizeof를 통해서 알아보자.

int (*temp)[2]; //*temp는 2개의 대상체를 가지고있는 배열을 가르킨다 라고 생각하자.
 int temp_array[3][2] = {{0,1},{3,5},{7,9}};
 

 temp = temp_array;

 cout<<temp_array<<endl;
 cout<<temp_array[0]<<endl;
 cout<<&temp_array[0][0]<<endl;

 cout<<sizeof(temp_array)<<endl;
 cout<<sizeof(temp_array[0])<<endl; 
 cout<<sizeof(&temp_array[0][0])<<endl;

이렇게 모두 주소가 같지만 다른 메모리 크기가 나오는것을 확인할 수 있다.






 

'프로그래밍 기초 > C포인터' 카테고리의 다른 글

문자열 포인터  (0) 2010.05.25
2차원 포인터 배열  (0) 2010.05.25
배열포인터의 특징  (0) 2010.05.25
배열과 포인터  (0) 2010.05.19
포인터란?  (0) 2010.05.19
Posted by 아몰라

우선 간단히 배열이란 무엇인지 생각해봐야한다.

int temp1;
int temp2[10];

temp라는 변수명을 가진 변수는 4바이트지만
temp2는 하나의 변수명으로 무려 10개의 int형 변수를 10개를 만든 것이다.


배열의 특징 세가지를 정리하면

1. 배열명은 주소를 뜻한다.

2. 배열명은 배열의 첫번째 배열 요소의 주소를 뜻한다.

 int temp_array[3] = {1, 3, 5};
 int *temp;

 temp = temp_array;

 cout<<*temp<<endl;
 cout<<*(temp+1)<<endl;
 cout<<*(temp+2)<<endl;

 cout<<temp_array<<endl;  //배열명을 출력해보았다. 주소가 나온다.
 cout<<temp_array+1<<endl;
 cout<<temp_array+2<<endl;

 cout<<*temp_array<<endl;  //이렇게 배열명을 역참조를 해보면 값이 나온다.
 cout<<*(temp_array+1)<<endl;
 cout<<*(temp_array+2)<<endl; 



위와 같이 포인터랑 배열에 +1같은 연산을 함으로서 첫번째 배열에 있는 값이 아닌 값을 참조 할 수도 있다.


또 추가적으로

 cout<<&temp_array<<endl;
 cout<<&temp_array+1<<endl;
 cout<<&temp_array+2<<endl;

이렇게 해보면 배열명에 주소에 접근한뒤 +1 이나 +2를 하면 주소값이 12씩 증가하게 되었다.
즉, 배열명의 크기만큼 증가하게 되었다.

근데 의문이 가는게 &temp_array+1 과 temp_array+1 이 값이 다르게 나오는게 이해가 가지않는다.
temp_array랑 &temp_array는 배열명이기 때문에 어차피 똑같은 주소(0012FF58)가 나오는데 그 주소에서 +1을 하면 둘다 같아야 되는게 아닌가? 누군가에게 물어봐야겠다 -_-


3. 배열명에는 주소를 할당 할 수 없다. 배열명은 포인터변수가 아니라 배열명 자체일 뿐이다.

말 그대로 할당 할 수 없다

temp = temp_array;
temp = temp_array+1;
가능하다. 포인터에 배열의 주소값들이 들어갈수있을것이다.

temp_array = temp;
temp_array = temp+1;
불가능하다. 배열에는 포인터가 아니라 값이 들어가야 한다.


--------------------------------------------------------------------------------------------------------
알아본 결과 예전에는 temp_array 는 배열 상수일뿐이고 저장된 영역이 없기때문에 출력하라는거 자체가 말이 안되서 오류가 났다고 한다. 하지만 ANSI에서 배열명에 &연산자를 허용해주어서 에러가 안나는것이라 한다.
그러므로 &temp_array 자체가 말이안되는 것이다.  temp_array+1은 첫번째 주소에서 자료형크기만큼 &temp_array+1 는 배열명 크기만큼 커진다는 것만 이해해야겠다.

&temp_array는 어떠한 대상을 가르키고 있는것이 아닌 그냥 주소값일뿐 그래서 sizeof를 하게되면 4가나오게된다.

'프로그래밍 기초 > C포인터' 카테고리의 다른 글

문자열 포인터  (0) 2010.05.25
2차원 포인터 배열  (0) 2010.05.25
배열포인터의 특징  (0) 2010.05.25
2차원 배열포인터와 대상체  (0) 2010.05.20
포인터란?  (0) 2010.05.19
Posted by 아몰라

포인터란?

포인터
는 번지에 대한 기호화된 표현을 말한다.

즉, 주소를 말한다고 할 수 있다.

int temp;

temp라는 이름을 가진 변수가 선언되면

int형은 4바이트 메모리로 시스템이 할당을 해주고

각 바이트들은 다 주소가 있게 마련이다.

그 주소들이 포인터가 되는것이다.


포인터변수란?

말 그대로 포인터들을 담는 변수가 되는 것이다.

포인터변수에는 주소들만 저장할수 있게된다.

예를 들어 int *temp 이런식으로 포인터변수 정의를 할수 있는데

이렇게 되면 정수가 저장된 곳의 위치를 가르킬 수 있게 되는 것이다.

그러므로 temp = 5; 이런식의 표현은 되지않는다.

 int *temp;
 int t = 2;

 temp = &t;

cout<<*temp;  이런식으로 하면 temp포인터변수가 가르키고있는 값 2가 출력하게된다.

cout<<temp;  temp포인터변수에있는 가르키고있는 포인터가 출력된다. 즉, 주소가 출력된다.

cout<<&temp; temp포인터변수에 주소가 출력된다.

물론 주소는 4바이트니까 연속적으로
0x12FF60
0x12FF61
0x12FF62
0x12FF63
저장되지만 &temp로 출력을 하게되면 가장앞에 주소(60)가 출력되게된다.



포인터를 사용하므로서 생기는 장점은 차차 포인터를 정리하면서 마지막에 정리하겠다.

p.s  아 그리고 포인터들은 int *temp; 나 char * temp 나 다 4바이트씩 메모리를 가지게된다.






'프로그래밍 기초 > C포인터' 카테고리의 다른 글

문자열 포인터  (0) 2010.05.25
2차원 포인터 배열  (0) 2010.05.25
배열포인터의 특징  (0) 2010.05.25
2차원 배열포인터와 대상체  (0) 2010.05.20
배열과 포인터  (0) 2010.05.19
Posted by 아몰라

This는 자기 자신을 가르키는 용도로 사용된다. 그래서 자기 참조 포인터라 한다.

class Member 
{

 int Test1;
 int Test2;
public:
 Member(int Test1, int Test2 )
 {
  this->Test1 = Test1;
  this->Test2 = Test2;
 }
 virtual ~Member();
 void View()
 {
  cout<<Test1 <<endl <<Test2<<endl;
 }
 

};
 

int main()
{
 Member M(1, 2);
 M.View();
 return 0;
}


Test1, Test2 은 매개 변수 와 클래스 멤버변수와 이름이 겹친다

하지만 매개변수는 지역변수이므로 그 안에서 멤버변수 Test에는 접근할 수 없다

방법은 this 포인터를 이용해서 해당 객체의 멤버변수를 직접 가르키면 된다


class Member 
{

public:
 
 Member * GetThis()
 {
  return this;
 }
 

};

int main()
{
 Member * p1 = new Member();
 cout<<"포인터 p1 " << p1<<endl;
 cout<<"p1 의 this " << p1->GetThis()<<endl;

 Member * p2 = new Member();
 cout<<"포인터 p2 " << p2<<endl;
 cout<<"p2 의 this " << p2->GetThis()<<endl;

 return 0;
}



'프로그래밍 기초 > C++' 카테고리의 다른 글

반올림함수 만들기  (0) 2010.05.11
가상함수테이블  (0) 2010.03.04
다형성  (0) 2010.03.04
템플릿이란!?  (0) 2009.11.20
Posted by 아몰라
이전버튼 1 이전버튼