指针基本概念:
1.指针变量是一个变量,用来存放地址,地址唯一标识一块地址空间。
2.指针的大小固定是4/8个字节(32位平台/64位平台)。
3.指针有类型,指针的类型决定+-整数的步长,以及解引用时的权限。
字符指针:
如图,这是最简单的例子,我们利用指针p指向ch的地址,打印时,解引用p就能打印字符g啦。
如果使p指向常量字符串,打印时只打印了a这是为什么呢?其实,当我们用指针指向常量字符串时,指向的是首字符的地址,即a的地址。如果我们想打印字符串,直接用%s即可。
如上图是一种比较特殊的写法,我们可以把它当成数组,通过[]来选取某个字符。
不过需要注意的是,我们不能通过指针p来改变常量字符串的内容,否则就会出现下面的情况
分析:str1和str2是两个数组,数组的操作方式是将右边常量字符串的内容拷贝进来,所以他们是两个空间,只是内容相同,所以str1 != str2。而str3和str4是两个指针,编译器在处理的时候,会将相同的常量字符串做成同一个地址,所以,str3和str4指向的是同一个常量字符串,所以str3 == str4。如果在str3和str4前面都加上&,这时,他们表示的是各自的地址,就不一样了。如下图。
指针数组
指针数组是数组,是用来存放指针的数组。
上面是用指针数组模拟一个二维数组,因为arr里的元素都是指针,所以arr的类型是int*。
数组指针
数组指针就是指向数组的指针。
如上图,表示的是指针p指向有10个元素且元素都是整形的数组,注意*p左右两边的括号不能省略,否则就会变成指针数组了。注意:方括号里的大小不能省略,如果省略了,系统会默认是0。
例子:
分析:二维数组传参,形参部分可以写成指针。数组名是数组首元素的地址,我们可以把二维数组看成两个一维数组,此时p指向arr第一行的起始地址。
函数指针
可以看出,&函数名就是函数的地址,函数名也是函数的地址。
如上图,如果我们想用p指向add函数,可以先写出(*p),注意括号不能省略,接着查看add形参的类型和返回值的类型,按上图所示即可写出。(add前面的&可有可无)。
如果我们想调用,只需解引用然后给上实参即可。