指针可以说是C语言的灵魂,下面初步探讨指针。

指针概念

指针(pointer)是一个值为内存地址的变量,该内存地址为另一变量的存储地址。

间接运算符 *

* 运算符可以解引用出指定地址的值,如 *a 为解引用出a地址上的值。注意: * 为单目运算符且要用于地址上。一般把这种存储地址的变量称为指针类型变量。

声明指针

格式: 指针所指向的变量值类型 * 指针变量名。
如: int * pa; //声明一个指向整型变量pa。

const int * const pa; //声明一个值和指向对象的值都不能更改的指针变量

指针赋值

注意:指针所指向的对象只能是变量。
*pa=6 //输出无反应

指针与数组

数组名为数组第一个元素的地址。

以下为相等关系

1
2
3
4
*a = a[0];
*(a+1) = a[1];
*(*(a+1)) = a[1][0];
*a[1] = a[1][0];

数值地址与字符地址

数值地址加1,根据数字对应变量类型不同,实际移动的距离是sizeof(type)。
字符地址加1,实际移动的距离是sizeof(char),即实际移动的距离为1。

实例

构造个交换变量元素的函数

1
2
3
4
5
void interchange(int * u, int, * v)
{
int t;
t=*u; *u=*v; *v=t;
}

二维数组求和

1
2
3
4
5
6
7
int sum(int rows, int cols, int arr[rows][cols])  //采用变长数组
{
int sum=0;
for(int i=0; i<cols*rows; i++)
sum += *((char *)arr+sizeof(arr[0][0])*i); //这里转换成字符地址再加数组元素值的单位的字节数,以达成连加的效果
return sum;
}

总结

C语言的指针很灵活且功能强大,本文章旨在初步引入指针的功能,还有更多有趣的内容等待发现。