目录
指针
1、内存地址
将内存抽象称一个很大的一维字符数组,编码就是对内存的每一个字节分配一个文32位或者64位的编号这个内存编号我们称之为内存地址(唯一),内存中每一个数据都会分配相应的地址。
#include <iostream>
using namespace std;
int main()
{
int num=20;
cout<<&num<<endl;//&:取地址符号,就是看一下num的地址是多少。
cout<<sizeof(&num)<<endl;//查看num的地址大小,如果是32位系统,则输出4个字节;如果是64位系统,则输出8个字节
return 0;
}
2、指针和指针变量
指针:和int,double一样,是一种独立的数据类型,只不过这种数据类型存储的值是内存地址。
指针变量:其实就是变量,只不过这个变量接收的数据是内存地址,而不是普通的数据。不同的类型指针所占的存储单元的长度都是相同的。
#include <iostream>
using namespace std;
int main()
{
int num=10;
int* p1=#
cout<<sizeof(p1)<<endl;
char ch='w';
char* p2=&ch;
cout<<sizeof(p2)<<endl;
double st=23.12;
double* p3=&st;
cout<<sizeof(p3)<<endl;
return 0;
}
结果都是一样的:都是8(因为我这个系统是x86).
3、解除引用
* 运算符就是解除引用,其应用于指针变量,可以得到该地址处存储的值。
#include <iostream>
using namespace std;
int main()
{
int num=10;
int *p=#
cout<<*p<<endl;//10
return 0;
}
4、指针宽度和跨度
指针变量的类型,只要去掉变量名,剩下的部分就是指针变量自身的类型。
int *p:指针变量p的自身类型是int *;
指针变量所取内容的宽度是由指针变量所指向的类型长度决定的。
int num=0x01020304;
int *p=#
cout<< *p <<endl;//01020304
short *p1=(short *)#//short是占两个字节
cout<< *p1 <<endl; //0304
指针变量+1的跨度
指针变量+1的跨度是由指针变量所指向的类型的大小决定
short *p=NULL;
cout<<p<<endl;//0x00000000
cout<<p+1<<endl;//0x00000002
int *p1=NULL;
cout<<p1<<endl;//0x00000000
cout<<p1+1<<endl;//0x00000004
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、指针和数组
一维数组
#include <iostream>
using namespace std;
int main()
{
int s[5] = {1,2,3,4,5};
cout<<s<<endl;//数组名就是地址,代表的是首元素的地址,等价于int*
cout<<s+1<<endl;//代表地址值+1,一个地址值占4各字节,所以地址值+1相当于字节数+4
cout<<sizeof(s)<<endl;//代表的是s这个数组的总大小
cout<<s[1]<<endl;//代表的是第二个元素2
cout<<*(s+1)<<endl;//跟上边的结果一样。也是2
return 0;
}
8、二级指针
如果一个指针指向的是另一个指针,称为二级指针,或者指向指针的指针。
int num=23;
int *p=#
int **q=&p;
//*p:获取的是num的值;
//*q获取的是p的值,也就是num的地址值。
//**q获取的是num的值
9、指针和字符串
char flower[10]="rose";
cout<<fower<<endl;//输出rose
解释:数组名flower是首元素的地址,也就是r的地址,当cout在处理字符地址的时候,不是打印地址,而是打印这个地址对应的字符的内容
const char* p_flower="rose";
cout<<p_flower<<endl;//输出rose
cout<<*p_folwer<<endl;//输出r
解释:字符串常量代表的字符串,返回的值是首个元素的地址,当cout时,char指针以及引号括起来的字符串常量被解释为字符串的第一个字符的地址
10、字符指针地址
const char* arr[4]={"hello","hehehe","huhuhu","hahah"};
cout<<sizeof(arr)<<endl; //输出16