指针:一个变量的地址,即为该变量的指针
指针变量:专门用于存储其他变量地址的变量
【注】指针变量有自己的地址,它存储的内容也是一个地址
p指向x,意味着变量p的内容就是x的地址(p = &x;)
不同类型的指针变量之间不能相互赋值
借助指针实现从键盘输入的数的从小到大排列
#include <stdio.h>
int main()
{
int *p1, *p2, *p, a, b;
scanf("%d,%d", &a, &b);
p1 = &a;
p2 = &b;
if(a > b)
{
// 实现指针变量存储内容(a、b)的交换
p = p1;
p1 = p2;
p2 = p;
}
printf("a = %d, b = %d\n", a, b);
printf("max = %d, min = %d\n", *p1, *p2);
}
数组指针:指向数组元素地址的指针变量(可以与一个常量相加或相减)
a[i][j] == *(a[i] + j) == *(*(a + i) + j)
指针数组:数组的所有元素都是存放指针的数组(指针数组中,每一个元素都是指针变量)
将字符串的首地址赋给指针,用字符指针变量处理字符串
【注】字符指针变量和字符数组的区别
①字符数组中每个下标处存放一个字符;而字符指针变量中存放的是字符串的首地址
②赋值方式不同
char str[14]; str = "I love China" --> ×(因为str是数组
不能用赋值语句给字符数组赋值
而应当借助循环)
char *p; p = "I love China"; --> √(可以借助字符指针变量赋值
因为字符指针变量中只存储字符串的首地址)
指针函数:指返回值是一个指针的函数(主体是函数)
形如int *sum(int n) int *func(int a, int b)
函数指针:指向函数的指针(主体是指针)
形如int (*func)(int a, int b)
指针函数案例:
#include <stdio.h>
int *func(int n) // 指针函数(返回值为指针,主体为函数)
{
if(n < 0)
{
printf("error");
}
static int sum = 0;
int *p = ∑ // 设置指针p指向变量sum
for(int i = 0; i < n; i++)
{
sum += i;
}
return p;
}
int main()
{
int num = 10;
int *p = func(num); // 用指针p指向函数sum()
// 因为最后需要返回指针p,因此函数func需要定义为指针函数
printf("sum : %d", *p); // p指针指向的是func函数中的变量sum,因此存储的是sum的地址
return 0;
}
函数指针实例:
#include <stdio.h>
int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int (*p)(int, int); // 函数指针的定义
p = max; // 函数指针初始化(指向函数的指针)
int ret = p(10, 15); // 函数指针的调用
printf("max = %d ", ret);
return 0;
}
【错题】
1.
int a[6], *p1 = a, *p2 = p1;
则能够正确表示元素a[2]的是______或者______。
2. int a[9], *p = a;
则表示a[1]地址的表达式为?
3.下列程序输出结果为?
#include <stdio.h>
void swap(int x, int *y)
{
int t = x;
x = *y;
*y = t;
}
int main()
{
int a = 5, b = 10;
swap(a, &b);
printf("%d,%d\n", a, b);
}
【答案】
1. *(p1 + 1) *(p2 + 2)
当p2指向了p1之后,可视为p1和p2相同效果
2. p + 1(注意和第一题的区别是,这个题问的是地址而不是值)
3. 5,5(为什么a不是10?因为a在形参中没有被定义为引用型,因此swap函数不会修改a的值)