文章目录
- 前言
- 一、字符指针
- 二、数组指针
- 2.1 数组指针基础
- 2.2 数组指针作函数参数
- 三、void*类型指针
- 总结
前言
在c语言基础已经介绍过关于指针的概念和基本使用,本篇文章进一步介绍c语言中关于指针的应用。
一、字符指针
字符指针是指向字符的指针。
结果分析:
"abcedf"是一个常量字符串
p是一个指向常量字符串的指针
因为常量字符串不可被修改,所以使用const修饰,限制指针p
输出:
输出*p的值,p的值为常量字符串首元素的地址,即字符a的地址,所以输出的是a
输出p,当以%s格式输出时,会输出整个字符串。
结果分析:
常量字符串存储在只读数据区,相同的字符存储在同一块内存,所以第一个输出的是 ==
利用常量字符串初始化字符数组str1和str2,字符数组str1和str2会独立开辟空间存储
当把st1和str2的首元素地址分别赋值给ps1和ps2时,由于地址不相同,所以输出的是 !=
二、数组指针
2.1 数组指针基础
数组指针是指向数组的指针。
数组指针的语法定义如下:
数组元素类型 (*指针变量名)[数组大小];
//例如
int (*pa)[10];
pa是一个数组指针
指向的数组长度大小为10
指向的数组元素类型为int
pa的类型为:int (*)[10]
再论数组名:
一般情况下,数组名表示数组首元素地址;
特殊情况:
- sizeof(数组名),单独的数组名在sizeof(),求出的整个数组的大小,则数组名表示整个数组;
- &数组名,单独的数组名取地址,得到的是整个数组的地址,则数组名表示整个数组。
结果分析:
虽然arr和&arr的值相同,但是代表的意义完全不同。
arr表示首元素地址,arr+1表示的是第二2个元素,int 数组,所以他们相差4个字节的大小。
&arr表示整个数组的地址,&arr+1表示跳过一个数组,int[10]数组,所以他们相差40个字节。
2.2 数组指针作函数参数
数组指针作参数,一般是作二维及以上数组的参数。
//数组指针作参数
void print1(int(*pa)[3], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf("%d ",*(*(pa+i)+j));
}
printf("\n");
}
}
结果分析:
利用数组指针作为参数,遍历二维数组
arr表示数组名,表示数组首元素地址,二维数组首元素地址是第一行,即一个一维数组的地址
*(pa+i) 表示二维数组的第i行的首元素地址
*(pa+i)+ j 表示的是二维数组第i行第j列元素的地址
* (*(pa+i) + j)访问二维数组第i行第j列的元素,相对于arr[i][j]
三、void*类型指针
void*类型指针是一种无具体类型的指针,可以接收任何类型的地址。
void*类型指针的注意点:
- 不能对void*类型指针进行解引用
- 不能对void*类型指针进行±整数操作
如果想要对void*类型进行解引用,必须进行强制类型转换。
int main()
{
int a = 10;
void* pa = &a; //接收int*类型地址
printf("%d\n", *(int*)pa); //(int*)pa对pa进行强制类型转换
return 0;
}
总结
本篇文章介绍了字符指针和数组指针的使用、以及void*类型指针。