目录
什么是指针/地址?
内存被划为很多格子(内存单元)
【】0 每个格子都有一个编号
【】1 32位指的是32根地址线—物理线-通电后有正负电-1/0
【】2 把从全零到全一的所有可能—2^32作为编号 (即需要32个二进制位)
【】3 这种编号就被称为地址
【】4 一个地址(内存单元)大小在位数不同的计算机中不同
64中是8个字节(64bit)
32位中是4个字节(32bit)
一个变量的(内存)地址就被称为该变量的“指针”。即指针就是地址
指针变量就是存放内存地址的变量
指针的常见类型:
1、一级指针
一级指针变量可以存放与自己定义类型相同的的参数的地址
2、二级指针
二级指针变量可以存放对应类型的一级指针的地址
3、数组指针
数组指针变量可以存放与定义类型相同的数组的地址
4、函数指针
函数指针变量可以存放与定义类型相同的函数的指针
常见指针实例:
int a;
int arr[5];
int Add(inx,iny)
{return x+y;}
int* p=&a; //这里的p就是一级指针变量
int**pa=&p; //这里的pa就是二级指针变量
int (*parr)[5]=&arr //这里的parr就是数组指针
int(*pa)(int,int)=&Add //这里的pa就是函数指针
函数指针详细可以参考 函数指针讲解
常量指针:
char* ps="hellow";
其中的hellow被称为常量字符串。
常量字符串不能更改,在内存中只占一个空间
即在指针赋的常量在内存中只有一份
重复定义许多指针也不会再开辟空间
严格定义时应为
const char* ps="hellow";
指针变量的定义方法:
int*pa=&a
*说明pa是指针
int说明pa的执行对象是int型
int说明指针在地址中取数据时是按int大小去取的
同理int可替换为其他的类型
&a指的是取出a的地址
&是取地址号
*pa=20
而这里的*为解引用操作符,*pa就是通过pa里的地址,找到a
指针所需占用的空间
指针需要多大空间取决于地址的存储需要多大空间
32位 需要32bit即4byte所以32位中指针需要4字节
64位 需要64bit即8字节所以64位中指针需要8字节
指针类型的意义:
1、指针类型决定了:指针解引用的权限有多大
2、指针类型决定了:指针走一步能走多远
对上的解释:
不同指针类型的操作权限不同
例如char*p虽然可以装下int型变量的地址但是在改变其值的时候操作权限只能改变其前1个字节的值而对后面地址无法更改
地址有关常识
1、局部变量是放在栈区上的
栈区内存的使用习惯是:
先用高地址空间,再用低地址空间
2、数组随着下标的增长地址是由低到高变化的
所以如果数组越界,可能会作用到其他的变量上改变其他变量的值
指针与数组
1、数组名就是数组首元素的首地址。
2 、 arr[2]<=>2[arr]
*(arr+2)<=>*(2+arr)
arr[2]<=>2[arr]
3、[]是一个操作符,2和arr是两个操作数.
4、编译器在处理时最后都是把
arr[2]转换为*(arr+2)进行运算的.
5、数组允许读取超过数组后一位的地址的比较
但不允许比自己数组前面的地址 .