目录
指针
1、内存地址
2、指针和指针变量
3、解除引用
4、指针宽度和跨度
5、void类型指针
6、const和指针
7、指针和数组
8、二级指针
9、指针和字符串
10、字符指针地址
指针
1、内存地址
将内存抽象称一个很大的一维字符数组,编码就是对内存的每一个字节分配一个文32位或者64位的编号这个内存编号我们称之为内存地址(唯一),内存中每一个数据都会分配相应的地址。
#includeusing namespace std; int main() { int num=20; cout<<&num< 2、指针和指针变量
指针:和int,double一样,是一种独立的数据类型,只不过这种数据类型存储的值是内存地址。
指针变量:其实就是变量,只不过这个变量接收的数据是内存地址,而不是普通的数据。不同的类型指针所占的存储单元的长度都是相同的。
#includeusing namespace std; int main() { int num=10; int* p1=# cout< 结果都是一样的:都是8(因为我这个系统是x86).
3、解除引用
* 运算符就是解除引用,其应用于指针变量,可以得到该地址处存储的值。
#includeusing namespace std; int main() { int num=10; int *p=# cout<<*p< 4、指针宽度和跨度
指针变量的类型,只要去掉变量名,剩下的部分就是指针变量自身的类型。
int *p:指针变量p的自身类型是int *;
指针变量所取内容的宽度是由指针变量所指向的类型长度决定的。
int num=0x01020304;
int *p=#
cout<< *p <
short *p1=(short *)#//short是占两个字节
cout<< *p1 <
指针变量+1的跨度
指针变量+1的跨度是由指针变量所指向的类型的大小决定
short *p=NULL;
cout<
cout<
int *p1=NULL;
cout<
cout<
5、void类型指针
void * 指针变量可以指向任意变量的内存空间,任何类型的指针变量都可以转为void *
int num=10;
void *p1=#
short num1=23;
void *p2=#
注意:不要对void* 指针变量做解引用和算术运算,如果 想通过void*指针变量取出内容,必须进行强制转换。
6、const和指针
1、如果const位于*左侧,表示指针变量所指向的数据是常量,不能通过解引用修改该数据,指针变量可以指向其他的内存单元
const int *a;
//*a的值不能改变,但是a的值(即地址值)可以改变
2、如果const位于*右侧,表示指针变量本身是常量,不能指向其他内存地址,指针变量所指向的数据可以修改。
int * const a;
//a 的值(即地址值)不能改变,但*a的值可以改变
3、如果const位于*左右各一个,表示指向常量的指针常量,也就是指针变量和指针变量所指向的数据也不能改变
const int * const a;
//a的值(即地址值)和*a的值都不可以改变。
7、指针和数组
一维数组
#includeusing namespace std; int main() { int s[5] = {1,2,3,4,5}; cout< 8、二级指针
如果一个指针指向的是另一个指针,称为二级指针,或者指向指针的指针。
int num=23;
int *p=#
int **q=&p;
//*p:获取的是num的值;
//*q获取的是p的值,也就是num的地址值。
//**q获取的是num的值
9、指针和字符串
char flower[10]="rose";
cout<
解释:数组名flower是首元素的地址,也就是r的地址,当cout在处理字符地址的时候,不是打印地址,而是打印这个地址对应的字符的内容
const char* p_flower="rose";
cout<
cout<<*p_folwer<
解释:字符串常量代表的字符串,返回的值是首个元素的地址,当cout时,char指针以及引号括起来的字符串常量被解释为字符串的第一个字符的地址
10、字符指针地址
const char* arr[4]={"hello","hehehe","huhuhu","hahah"};
cout<



