知识点
- 指针运算
- 指针和多维数组
指针运算(九种)
赋值(给指针变量赋值)
#include <stdio.h>
#define SIZE 5;
int main(void)
{
int arr[SIZE]={1,2,3,4,5};
int * p1, *p2;//指针变量
p1=arr;//arr数组首地址赋值改指针变量p1
return 0;
}
解引用
*运算符
给出 指针指向地址上存储的值
取址
和所有变量一样,指针变量也有自己的地址和值, 对指针而言, &运算符给出 指针本身的地址。
#include <stdio.h>
#define SIZE 5
int main(void)
{
int arr[SIZE] = { 2,3,-1,8,4 };
int* p1, p2;//指针变量
p1 = arr;//arr首地址赋值给p1指针变量
printf("$p1=%p , &arr=%p\n", &p1,&arr);//指针变量也有自己的地址
return 0;
}
指针与整数相加
如果相加的结果超出了初始指针指向的数组范围,计算结果则是未定义的。
指针减去一个整数:
递增指针
递减指针
指针求差
可以计算两个指针的差值
比较:
使用关系运算符可以比较两个指针的值,前提是两个指针都指向相同类型的对象。
二维数组地址的结构
- zippo ←二维数组首元素的地址(每个元素都是内含两个int类型元素的一维数组)
- zippo+2 ←二维数组的第3个元素(即一维数组)的地址
- *(zippo+2) ←二维数组的第3个元素(即一维数组)的首元素(一个int类型的值)地址
- *(zippo+2) + 1 ←二维数组的第3个元素(即一维数组)的第2个元素(也是一个int类型的值)地址
- ((zippo+2) + 1) ←二维数组的第3个一维数组元素的第2个int类型元素的值,即数组的第3行第2 列的值zippo[2][1])
指向多维数组的指针
如何声明一个指针变量 (pz),指向一个二维数组?
pz必须指向一个内含两个int类型值的数组,而不是指向一个int类型值,其声明如下:
int (* pz)[2]; // pz指向一个内含两个int类型值的数组 ,[]的优先级高于*
(* pz)[2]和 *pz[2]的区别
int * pax[2]; // pax是一个内含两个指针元素的数组,每个元素都指向int的指针
由于[]优先级高,先与pax结合,所以pax成为一个内含两个元素的数组。
然后*表示: pax数组内含两个指针。最后,int表示pax数组中的指针都指向int类型的值。
因此,这行代码声明了两个指向int的指针。而前面有圆括号的版本,*先与pz结合,因此声明的是一个指向数组(内含两个int类型的值)的指针。
案例:
// array2d.c -- 处理二维数组的函数
#include <stdio.h>
#define ROWS 3
#define COLS 4
void sum_rows(int ar[][COLS], int rows);
void sum_cols(int [][COLS], int); // 省略形参名,没问题
int sum2d(int(*ar)[COLS], int rows); // 另一种语法
int main(void)
{
int junk[ROWS][COLS] = {
{ 2, 4, 6, 8 },
{ 3, 5, 7, 9 },
{ 12, 10, 8, 6 }
};
sum_rows(junk, ROWS);
sum_cols(junk, ROWS);
printf("Sum of all elements = %d\n", sum2d(junk, ROWS));
return 0;
}
void sum_rows(int ar[][COLS], int rows)
{
int r;
int c;
int tot;
for (r = 0; r < rows; r++)
{
tot = 0;
for (c = 0; c < COLS; c++)
tot += ar[r][c];
printf("row %d: sum = %d\n", r, tot);
}
}
void sum_cols(int ar[][COLS], int rows)
{
int r;
int c;
int tot;
for (c = 0; c < COLS; c++)
{
tot = 0;
for (r = 0; r < rows; r++)
tot += ar[r][c];
printf("col %d: sum = %d\n", c, tot);
}
}
int sum2d(int ar[][COLS], int rows)
{
int r;
int c;
int tot = 0;
for (r = 0; r < rows; r++)
for (c = 0; c < COLS; c++)
tot += ar[r][c];
return tot;
}