指针与指针变量

指针:一个地址,是一个常量,不能被改变。

指针变量:可以被赋予不同的指针值,是变量。

指针变量存储的是内存地址,通过这个地址可以访问或修改对应内存中的数据。

指针变量的定义

// 定义指向整型的指针变量 int* ptr; // 定义指向字符的指针变量 char* charPtr; // 定义指向双精度浮点数的指针变量 double* doublePtr;

指针变量的赋值

初始化方法

int a; int* p = &a; // 定义时初始化

赋值语句方法

int a; int* p; p = &a; // 正确写法 // *p = &a; // 错误写法!

注意:指针变量只能存放地址,不允许把一个数直接赋给指针变量。

例如:int* p = 100; 是错误的。

空指针与数组指针

空指针

int* ptr = NULL; // 声明一个空指针

空指针不指向任何有效内存地址,使用前应检查指针是否为空。

指向数组的指针

int arr[10]; int* ptr = arr; // 指向数组的第一个元素

数组名本身就是一个指针常量,指向数组的首元素。

指向函数的指针

int add(int a, int b) { return a + b; } // 定义函数指针并赋值 int (*ptr)(int, int) = add;

指针的运算

指针的加减法运算

int arr[5] = {1, 2, 3, 4, 5}; int* ptr = arr; // 指向第一个元素 ptr = ptr + 2; // 向后移动两个位置 printf("%d", *ptr); // 输出"3"

指针的递增和递减

int* ptr = arr; ptr++; // 向后移动一个位置 printf("%d", *ptr); // 输出"2"

指针间的减法

int* ptr1 = &arr[0]; int* ptr2 = &arr[3]; int diff = ptr2 - ptr1; // 计算相差元素个数 printf("%d", diff); // 输出"3"

示例分析

#include main() { char a[] = "hdddww", *p = a; p++; printf("%c", (*p)++); printf("%s", p); }

运行结果:deddww

解析:

  1. 指针p指向字符串"hdddww"的首地址
  2. p++后指向第一个'd'
  3. (*p)++先输出'd',然后将该位置字符变为'e'
  4. 最后输出从当前位置开始的字符串"eddww"

指向一维数组的指针

访问数组元素的两种方法:

下标法

int a[10]; a[i]; // 直接通过数组名访问

指针法

int a[10]; int* p = a; *(p + i); // 通过指针变量间接访问

示例:使用指针输入输出数组

#include "stdio.h" main() { int a[10], *p = a, i; for(i = 0; i < 10; i++) scanf("%d", p + i); // 无需&,p+i已是地址 for(i = 0; i < 10; i++) printf("%d", *(p + i)); }

指针变量作为函数参数

指针变量作为函数参数时,实现的是地址传递,具有双向传值的效果。

示例分析

#include void fun(int* p, int a[]) { int i; for(i = 1; i < 4; i++) *p *= a[i]; } main() { int a[] = {2, 1, 2, 4}, s = 1, *p = &s; fun(p, a); printf("%d", *p); }

运行结果:8

解析:2 * 1 * 2 * 4 = 8

指向二维数组的指针

行指针的定义

类型说明符 (*指针变量名)[长度]; // 例如: int (*p)[3]; // 指向包含3个整型元素的一维数组

注意:长度必须与所指向的二维数组的列数相同。

行指针的运算特性

  • 行指针变量每加1,跳过一行
  • 如果p是行指针,那么*p是普通指针,**p是元素值

示例:使用行指针输出二维数组

int a[2][3] = {{1,2,3}, {4,5,6}}; int (*p)[3] = a; for(int i = 0; i < 2; i++) { for(int j = 0; j < 3; j++) { printf("%4d", *(*(p+i)+j)); } printf("\n"); }

真题解析(2022年)

下列程序的功能是从存放成绩的二维数组中,找到并输出最大值及其所在行号与列号。

#include #define CLASS 3 ____________________1__________________________ int main(void) { int score[CLASS][4] = {{81,72,73,64}, {65,86,77,88}, {91,90,85,92}}; int maxScore, row, col; // 调用FindMax函数 maxScore=____________________2_________________________; printf("max=%d, row=%d, col=%d\n", maxScore, row+1, col+1); return 0; } int FindMax(int* p, int m, int n, int* pRow, int* pCol) { int i, j, max; max = ____________________3__________________________ // 初始化为第一个元素 *pRow = 0; *pCol = 0; for(i = 0; i < m; i++) { for(j = 0; j < n; j++) { if(____________________4__________________________) { max = p[i*n + j]; *pRow = i; *pCol = j; } } } ____________________1__________________________ }

运行结果:max=92, row=3, col=4