指针与指针变量
指针:一个地址,是一个常量,不能被改变。
指针变量:可以被赋予不同的指针值,是变量。
指针变量存储的是内存地址,通过这个地址可以访问或修改对应内存中的数据。
指针变量的定义
// 定义指向整型的指针变量
int* ptr;
// 定义指向字符的指针变量
char* charPtr;
// 定义指向双精度浮点数的指针变量
double* doublePtr;
指针变量的赋值
初始化方法
int a;
int* p = &a;
赋值语句方法
int a;
int* p;
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);
指针的递增和递减
int* ptr = arr;
ptr++;
printf("%d", *ptr);
指针间的减法
int* ptr1 = &arr[0];
int* ptr2 = &arr[3];
int diff = ptr2 - ptr1;
printf("%d", diff);
示例分析
#include
main() {
char a[] = "hdddww", *p = a;
p++;
printf("%c", (*p)++);
printf("%s", p);
}
运行结果:deddww
解析:
- 指针p指向字符串"hdddww"的首地址
- p++后指向第一个'd'
- (*p)++先输出'd',然后将该位置字符变为'e'
- 最后输出从当前位置开始的字符串"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);
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];
行指针的运算特性
- 行指针变量每加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;
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