大家好,今天小魏来发表自己对指针的认识啦,如有错误,请大佬斧正!
我们通常所说的指针其实就是指针变量,它是一个变量,用来存放地址,内存会划分为一个个小的内存单元,每个内存单元都有自己的编号,这个编号就是这个内存单元的地址,用指针来存放。
我们用图就更清楚了
因此,内存编号=地址=指针
当要存储指针或者地址时就用指针变量来存储
指针大小与其类型无关,主要看编译器所处的环境,如我们所使用的的编译器VS2019的x86环境,也就是我们所说的32位平台,就是4个字节的大小,而在64位平台上就是8个字节。
指针是有类型的,而它的类型决定了这个指针+1或-1跳过的元素数,比如整形指针+1或-1跳过4个元素,而字符型指针跳过1个
指针也是可以进行运算的
可以进行指针+-整数
可以进行指针-指针(不能进行指针+指针)
可以进行指针的关系运算,比如比大小
这个不可以的,指针大小为4个字节,而这个字符串有7个字节,这是错误的做法
大家猜一猜这段代码的运行结果是啥呢,反正我第一次做这个题的时候做错了,我认为这两个都相等,其实不然
我们来分析一下 上图
下面让我们来区分几个概念
1.指针数组
顾名思义,指针数组是数组,是用来存放指针的数组,举个例子
这个arr是int*类型的
这里的arr1,arr2,arr3代表的是数组首元素地址,用 pc这个指针来存放地址,这也是一个指针数组,存放的三个元素。
注意,一般来说数组名基本都代表数组首元素地址。但有两个特例,第一个是sizeof(数组名),它代表的是整个数组。第二个是&arr,代表取出的是整个数组的地址。
这样就可以访问到这个数组了,这里就相当于模拟了一个二维数组,parr[3]当中就存放了第一行第二行第三行的地址,二维数组中一行代表一个元素,然后再利用+j来访问具体的元素,要注意二维数组在内存中是连续存放的。
2.数组指针
数组指针是指针。
例如int(*p)arr[10] 这就是一个数组指针。在规定中[]的级别比*高,所以要打括号
把名字去了就是其类型,这个的类型为int (*)[10]
例 int(*p)arr[10]=&a
p是一个指针,指向数组arr[10],所以p叫数组指针
char* arr[5]
char* (*p)=&arr
要存放地址,肯定要用指针,而且这个数组是char*类型的,所以就要这样表示
一维数组传参时,调用函数形参可用数组,也可用指针
二位数组也是如此
预知后事如何,且听下回分解