目录
一、字符指针
二、数组指针
1、数组指针的定义
2、&数组名和数组名
3、数组指针的使用
三、数组传参和指针传参
1、一维数组传参
2、二维数组传参
3、一级指针传参
4、二级指针传参
一、字符指针
在指针的类型中我们知道有一种指针类型为字符指针 char*。像下面的形式就是字符指针。
int main()
{
char ch = 'w';
char* pc = &ch;
*pc = 'w';
const char* p = "hello world.";//这里是把一个字符串放到p指针变量里了吗?
printf("%s\n", p);
return 0;
}
在这里特别容易让我们以为是把字符串 hello world 放到字符指针 p 里了,其实不是,只是把字符串 hello world. 的首字符的地址放到了p中。 *p指向的是数组常量不能被改变所以用const来进行修饰。
二、数组指针
1、数组指针的含义
数组指针到底是数组还是指针,在这里我的回答是指针,它指向数组的指针。
整形指针:int* pint ,能够指向整型数据的指针。
浮点型指针:float* pf ,能够指向浮点型数据的指针。
数组指针:int (*p) [10],能够指向数组的指针。
p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整形的数组,所以p是一个指针,指向一个数组,叫数组指针。
注意:[ ]的优先级要高于*号的,所以必须加上( )来保证p先和*结合。
2、&数组名和数组名
int arr[10];
我们都知道数组名是首元素地址。&arr又是什么呢?
可以看出数组名和&数组名打印出来的地址是一样的。但是他们还是有区别的,如下:
上述发现,其实&arr和arr ,虽然值一样,但是意义是不一样的。
实际上:&arr表示的是数组的地址,而不是数组首元素的地址。本例中&arr的类型是 int ( * )[10],是一种数组指针的类型。数组的地址+1,跳过了整个数组的大小,所以&arr+1相对于&arr的差值是40字节。
3、数组指针的使用
数组名arr,表示首元素的地址,但是二维数组的首元素是二维数组的第一行,所以这里传递的arr,其实相当于第一行的地址,是一维数组的地址,可以数组指针来接收。
三、数组传参和指针传参
1、一维数组的传参
以上的传参方式都是可以的。
当我们使用一维数组传参的时候,有三种接收方式:省略接收,完整接收,一级指针接收。
当我们使用指针数组传参的时候,有两种接收方式:完整接收,二级指针接收。
2、二维数组的传参
二维数组传参的时候,有三种方式:完整接收,省略行接收,数组指针接收。
在这里二级指针接收方式就不行了,因为二维数组在传递时,传递的是第一行第一列元素的地址,本质上仍是一级指针,如果想换成一级指针接收,就更错了,因为单纯靠一级指针无法判断一行有几个元素,是无法访问的。因此如果就想用指针接受的话,就得用数组指针,这种指针包含了一级指针和列元素这两个重要条件,可以进行正常访问的。
3、一级指针的传参
无论是直接传递数组名还是传递指针,本质上都是一样的,都是指针,因为数组名就是首元素地址,也就是指针,因此两种方式传参,最后用一级指针接收就行。
4、二级指针的传参
二级指针传参时,可以直接传过去,也可以取到一级指针的地址,然后再传过去,本质上是一样的,只不过借助了一级指针这个工具而已。
本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。