C\C++指针,梳理,让人头疼的指针就要慢慢啃

1 基础概念
在这里插入图片描述
通过上图可以知道
首先(左一)定义了两个变量a,b,其中a=2;b=3;a的地址是A008,b的地址是A00A,然后又定义了一个指针变量p,地址为A00B,存放的是变量a的地址。记住这段话:一个变量的地址称为这个变量的指针,指针是一个静态地址的概念,变量a的地址A008就是变量a的指针。用来存放变量地址的变量称为指针变量。变量p存放的是变量a的地址,称为变量p为变量a的指针变量。
另外需要知道*是指针说明符,用来说明其后的指针变量,指针变量的内存单元存放的数据称为指针的内容。指针变量存储地址值,该地址只能指向语句定义的数据类型,不能指向其他的数据类型。
int *p;
知识提示作用,而非变量名本身,该指针变量名为p,而不是p。
指向数组类型的指针称为数组指针
指向函数的指针称为函数指针

2 指针的初始化
int a[4]={1,2,3,4},*pa = a;
指针名 = 地址值 ;右边的变量为地址
#include
using namespace std;

int main(void)
{
int a[4] = { 1,2,3,4 }, *pa = a;
cout << a << endl;
cout << pa << endl;
cout << *(pa+1) << endl;
return 0;
}
不同类型的指针是不能是不能赋值初始化的
int n = 6;
float t;pt = &n;//错误,不能用整形变量初的地址为单精度型指针变量赋初值。
C++允许动态分配内存地址,使用malloc函数动态分配一个指定长度的连续空间
语法:malloc(size)
语义:malloc(size)指在内存中分配一个长度为size字节的连续空间,若分配成功,函数返回值为起始地址,否则为0.由于malloc函数返回值为void
类型,因此,必须用强制类型转换(int *)转换成整型指针。
p = (int *)malloc(sizeof(int));
使用free函数进行内存释放
free§
3 取地址运算发&
取地址运算符&,用于取变量的地址
int a[3]={4,3,2},y = 6,*pa = &a[1],*py=&y;
语义:&取地址运算,取变量或数组元素地址。该地址由编译系统在程序运行时分配
int x = 4,y[3]={1,2,3},*px,*py;
px = &x;//将变量x的地址复制给指针变量
py = &y[2];//将数组元素y[2]的地址赋给指针变量py
其中,&x取变量x的地址,&y[2]取数组元素y[2]的地址,不能用&y,因为数组名y是地址常量,不能取常量的地址。
注意:
px = &(a+4);//错误,表达式没有地址
py = &2 + &b;//错误,不能取常量或数组名的地址
寄存器变量存放于寄存器中,没有地址概念,不能取寄存器地址
regeister int c,*pc = &c;
&a运算,先考虑运算符的优先级别,两者优先级别相同,结合方向是兹有向左,所以,计算的次序为(&a),先由&a计算变量a的内存地址,
在这里插入图片描述
大家定义指针的时候可以以这种形式展开,画格子,看看每一步到底干啥了,如何表示。
上面这个图第三个,通过执行p = pb,*p = *pa + pb;
其实
p = *pa + *pb;通过修改地址找到所对应的单元里面的内容。
输出结果如下:*pa=2 *pb=5 *p=5
不知道你看明白没,pa是没做变化的,而p是进行改变了,p和pb对应地址一直,所以值一样都被改变了,并且值是一样的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值