指针

91 阅读3分钟
知识点
  1. 指针运算
  2. 指针和多维数组
指针运算(九种)
赋值(给指针变量赋值)
#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;
}