06_指针基础
一 概念
为了方便访问内存中的内容,给每一个内存单元编号,我们称这个编号为地址,也就是指针。
指针是一种数据类型 所以 指针有自己的内存 存储的是编号(地址)
* 要素
1 指针本身的类型 指向的按类型*
2 指针指向的类型 可以是所有类型 包括是指针类型、数组类型、函数类型……
但是具体某种类型指针 只能指向具体的类型
3 指针本身的内存
4 指针指向的内存 可以是各种类型 内存大小不限定
二 定义
// 类型 变量名;
int num = 10;
// 类型 变量名;
// 指针类型 指针名;
// 指向的类型* 指针名;
// *:指针定义 在定义时 表示定义的是一个指针
// *:取内容符 在别的地方 表示取后面的这个指针的内容
// &:取地址符 表示取地址
int* pnum = #
*pnum = 2; // 等价于 num = 2;
cout << num << endl;
三 内存
因为指针只存编号(地址),所以,所有指针本身的内存:四个字节。
四 赋值
1 用对应类型的地址
int num = 0;
int* pnum;
pnum = #
2 用相同类型的指针
int num = 0;
int* p1 = #
int* p2 = p1;
3 直接用地址
int* pi = (int*) 0X36;
4 用数组名
数组名就是数组的首地址
int arr[5] = {1,2,3,4,5};
int* parr = arr;
5 字符串(char*)
cout<< char*类型指针<<endl;
此时会打印字符串
char* pch = "gkul";
int arr[5] = { 1, 2, 3, 4, 5 };
cout << arr << endl;
char str[5] = { '1', 's', '4', 'b', '\0' };
cout << str << endl;
char* pch = "ghjk";
cout << pch << endl;
// 字符数组首地址 是char*类型
// char*类型可以直接cout整个字符串 直到'\0'为止
6 置空
有时候,指针定义后或使用后,没有了指向,但是指针还在。
由于指针可以直接操作内存,不安全。
所以在内存开始时(地址编号为0)的地址,作为一个特殊地址。
将指针指向这里是安全的。
int* p1 = NULL;
int* p2 = nullptr;
int* p3 = (int*)0X0;
7 多级指针
int num = 10;
cout << num << endl; // num的值
cout << &num << endl; // num的地址
int* pnum = #
cout << pnum << endl; // num的地址
cout << *pnum << endl; // num的值
cout << &pnum << endl; // pnum的地址
int ** pp = &pnum;
cout << pp << endl; // pnum的地址
cout << *pp << endl; // num的地址
cout << **pp << endl; // num的值
cout << &pp << endl; // pp的地址
int *** ppp = &pp;
cout << ppp << endl; // pp的地址
cout << *ppp << endl; // pnum的地址
cout << **ppp << endl; // num的地址
cout << ***ppp << endl; // num的值
short sh = 10;
short* psh1 = &sh;
short* psh2 = psh1;
short** ppsh1 = &psh2;
short** ppsh2 = ppsh1;
short*** pppsh = &ppsh2;
***pppsh = 9;
cout << "sh = " << sh << endl;