C ++ Primer Plus Notes 3 (4 장 포인터)

 포인터 앞에있는 * 연산자를 간접 값 또는 역 참조 연산자라고합니다.

1. 에서 포인터 선언 ++ C : INT * PTR; // 강조 것을 INT의 *가 에 대한 형식 포인터 INT는 . ptr 자체는 포인터입니다.

                                int * p1, p2; // 포인터 p1과 int 변수 p2를 선언합니다.

2. ** 포인터 초기화 : ( 가리키는 값을 초기화하지 않음 ) int h = 5; int * pt = & h; [포인터 초기화가 매우 중요합니다.] (pt 삭제; // 허용되지 않음)

    다음 진술 : long * fellow; * fellow = 23323; // 버그가있을 것이며 동료가 가리키는 위치를 결정할 수 없으며 23323이 저장된 위치가 아닐 수 있습니다.

3. 포인터가 정수가 아닙니다 : int * pt; pt = 0xB8000000; // Illegal 

                               int * pt; pt = (int *) 0xB8000000; // legal

4. 라이브러리 함수 malloc ()을 사용하여 C에서 메모리를 할당합니다. C ++에서도 동일한 작업을 수행 할 수 있습니다. 또 다른 방법 인 new 연산자가 있습니다. new 및 delete는 쌍으로 사용해야합니다.

  int * pn = new int; .... delete pn; // delete를 사용하여 new가 할당 한 메모리를 해제합니다.

double * pd = new double; * pd = 10000001.0; // size of pd = 4, size of * pd = 8, 포인터 길이는 4 바이트, 뾰족한 데이터 유형과 관련이 없음

5. new를 사용하여 동적 배열을 만듭니다.

double * p3 = new double [3];   // 3 개의 doble 요소를 포함하는 배열을 만듭니다 . 포인터 p3는 메모리의 첫 번째 요소를 가리 킵니다.

p3 [0] = 0.2; p3 [1] = 0.5; p3 [2] = 0.8; // 배열의 요소에 대한 포인터 액세스

p3 = p3 + 1; cout << p3 [0] << ""<< p3 [1]; // 출력 결과는 p3 [0]이 0.5이고 p3 [1]이 0.8입니다. p3 + 1은 포인터가 두 번째 요소를 가리 키도록합니다.

p3 = p3-1; delete [] p3;   // 포인터를 놓으면 원래 값을 가리키며 1 씩 감소해야합니다. 어레이 메모리 해제시 [] 추가

6. 포인터 변수가 1 씩 증가한 후 증가는 가리키는 유형의 바이트 수와 같습니다.

대부분의 경우 C ++는 배열 이름을 배열의 첫 번째 요소 주소로 해석합니다.

배열 표기법을 사용할 때 C ++는 다음 변환을 수행합니다. array [i]-> * (array + i)

배열 이름 대신 포인터가 사용됩니다. C ++도 변환을 수행합니다. pt [i]-> * (pt + i) 

7. 배열의 길이를 얻기 위해 sizeof를 배열에 적용하고, 포인터의 길이를 얻기 위해 포인터에 sizeof를 적용 (= 4);

8. 어레이 주소

short tell[10];  

cout<<tell<<endl;  //显示&tell[0]的结果,是一个2字节的内存块地址

cout<<&tell<<endl; //对数组名取地址(&)显示整个数组的地址,是一个20字节的内存块地址

//tell是一个short指针 *short
//&tell是一个指向包含20个元素的short数组的指针 short(*)[20]

short (*pas)[20]=&tell; //pas指针指向含20个short元素的数组
//*pas等价于tell, (*pas)[0]=tell[0];

9. cout에 대한 포인터를 제공하면 주소를 인쇄하고 포인터 유형이 char *이면 cout은 가리키는 문자를 표시합니다.

   문자열 주소를 표시하려면 (int *) ps를 캐스트해야합니다.

 char animal [20] = "여우"; char * ps;

ps = animal; cout << ps << "at"<< (int *) ps << endl; // ps는 포인터이지만 문자열을 표시하고, (int *) ps는 문자열의 주소를 표시합니다.

10. new 및 strcpy ()를 사용하여 문자열 배열의 복사본을 가져옵니다.

  ps = new char [strlen (animal) +1];   

  strcpy (ps, animal); // 직접 할당 할 수 없음, ps = animal, 주소를 ps에 복사하고 싶습니다. 두 포인터는 동일한 메모리 단위와 문자열을 가리 킵니다. 문자열은 복사되지 않습니다.

11. new를 사용하여 동적 구조를 만들 때 포인터 pa는 구조에 대한 포인터와 구조 멤버에 액세스하는 방법을 나타냅니다 : (1) pa-> name; (2) (* pa) .name [name is a structure member]

12. 

struct Years
{
 int year;
 int month;
};
Years y1,y2,y3; //创建结构变量
Years ys[3];    //创建结构数组


const Years * apy[3]={&y1,&y2,&y3};  //创建指针数组

//创建上述指针数组的指针,两种方式
 const Years ** ppya=apy;   //方法1
 auto ppyb=apy;             //方法2,方便一点,不易搞混
//访问
std::cout<<(*ppya)->year<<std::endl;
std::cout<<(*(ppyb+1))->yrar<<std::endl;

13. 템플릿 클래스 벡터 클래스 (동적 배열)  : 응용 프로그램은 헤더 파일을 추가하는 것입니다. #include <vector>;

using spacename std;    vector <int> vi (n); // int 유형의 n 개 요소를 저장할 수있는 vi라는 벡터 객체, n은 정수 상수 또는 정수 변수 일 수 있음

14. 템플릿 클래스 배열 클래스  (C ++ 11) 응용 프로그램은 헤더 파일을 추가하는 것입니다 #include <array>; 배열과 마찬가지로 배열 객체는 고정 된 길이를가집니다.

using spacename std;    array <int, 5> ai; // int 유형의 n 요소를 저장할 수있는 ai라는 배열 객체, n은 정수 상수입니다. 여기서 n = 5;

15. 배열, 배열 객체, 벡터 객체는 표준 배열 표기법을 사용하여 각 요소에 액세스 할 수 있습니다.

배열 개체는 다른 배열 개체에 직접 할당 될 수 있으며 배열의 경우 데이터는 요소별로 복사되어야합니다.

배열 객체와 배열은 동일한 메모리 영역 (예 : 스택)에 저장되고 벡터 객체는 다른 영역 (무료 저장 영역 또는 힙)에 저장됩니다.

 

 

 

 

추천

출처blog.csdn.net/lvliang2017232003/article/details/85341687