【最头疼的指针】学习笔记(。・∀・)ノ゙

第一步,认识复杂类型

像是双胞胎 int (*p)[3];   int *p[3]; 

这都是啥orz...

划重点!从变量名处起,根据运算符优先级结合,一步一步分析.
一定要仔细看,不然真的晕

  1. int p;  //这个肯定都知道,定义一个整型变量。
  2. int *p;  //p先与*结合合体成为指针,再和int合体,那么p是一个返回整型数据的指针。

下面这仨可以看作一组

  1. int p[3]; //一个大小为3的整型数据的p数组。
  2. int *p[3]; // [] 优先级> * 优先级,所以p先和[]合体成为数组,再和*玩,说明里面存的是指针类型的元素,再和int结合就是p是一个返回整型数据的指针所组成的数组。
  3. int (*p)[3]; // p和*加括号啦所以他俩先好,那说明p是指针了,然后[]来了,说明指针指向数组,再是int,说明数组里的元素整型,即p是一个指向由整型数据组成的数组的指针。
  4. int **p;  //p+*说明p是一个指针,*p+*说明指针p指向的是指针,**p+int 说明整型数据,这种叫二级指针,一般用不到。
  5. int p(int);  //p+()说明p是一个函数,里面int是p的参数,外面的int说明p函数返回整型数据。
  6. int (*p)(int);  //p+*说明p是指针,后接(int)说明p指针指向的是一个参数为一个整型的函数,前加int表明函数的返回值为整型。

第二步,指针到底是什么

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
四大世纪难题:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。

指针的类型:

把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。

如 int (*p)[3]   ------ int (*)[3]

指针所指向的类型:

把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。

还是他int (*p)[3]  ------ int  ()[3]    ps:指针的类型(即指针本身的类型)和指针所指向的类型是两个概念

指针的值或者叫指针所指向的内存区:

指针的值是指针本身存储的数值,这个值将被编译器当作一个地址。 指针所指向的内存区就是从指针的值为首地址开始的一片内存区。

指针本身所占据的内存区:

用函数 sizeof(指针的类型)测
 

第三步,开始算指针

指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的,以单元为单位。

//是不是有点懵..康康真实操作

char s[10];
int *p =(int *)s;
p++;

p指针在++操作后从指向s[0]变成指向s[3]

解释一下——首先强制类型转换并不会改变 a 的类型,指针 ptr 的类型是 int*,它指向的类型是 int,它被初始化为指向整型变量 a。指针 p++,即其值加上了 sizeof(int),在 32 位程序中,是被加上了 4,因为int 占 4 个字节,而char 是一个字节所以跳四位。

---填坑分界线----

楼上这种操作在实际应用中容易产生错误,如把p++替换为p+=3就会越界,需要注意

一个指针加(减)一个整数 n 后,结果是一个新的指针,类型相同,所指向的类型也相同。

新指针所指向的内存区将比旧指针指向的内存区向高(低)地址方向移动了 n * sizeof(旧指针所指向的类型)个字节。

两个指针不能进行加法运算,这是非法操作,但可以进行减法操作。

第四步,其他的一些需要了解的知识

运算符&和*

这里&是取地址运算符,*是间接运算符。
&a 的运算结果是一个指针,指针的类型是 a 的类型加个*,指针所指向的类型是 a 的类型,指针所指向的地是 a 的地址。
*p 的结果是 p 所指向的东西,类型是 p 指向的类型,所占用的地址是 p所指向的地址。

#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
int main(){
	int a=12,b, *p,**ptr;
	p=&a;
	*p=24;
	*ptr=&b;
	**ptr=34;
	cout<<a<<' '<<b<<' '<<endl;
}

结果为:24 34

 

指针表达式
一个表达式的结果如果是一个指针,那么这个表达式就叫指针表式。

数组的数组名其实可以看作一个指针。

 

指针和结构类型

指针可以指向结构体,用指向运算符访问结构体的成员变量

struct node
{
int a;
};
struct node n={20};
struct MyStruct *ptr=&n;
cout<<ptr->a<<endl;

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值