指针的分析1:* 号的意义
在C语言中:
- 在指针声明时, * 号表示所声明的变量为指针
- 在指针使用时, * 号表示取指针所指向的内存空间中的值
int i = 0;
int j = 0;
// 指针声明
int* p = &i;
// 取值 (* 号类似一把钥匙, 通过这把钥匙可以打开内存, 读取内存中的值)
j = *p;
指针的分析2:传值调用和传址调用
- 指针是变量, 因此可以声明指针参数
- 当一个函数体内部需要改变实参的值,则需要使用指针参数
- 函数调用时实参将复制到形参
- 指针适用于复杂数据类型作为参数的函数中
/*
测试代码
利用指针交换变量
*/
#include <stdio.h>
void swap(int* a, int* b)
{
int c = *a;
*a = *b;
*b = c;
}
int main()
{
int aa = 1;
int bb = 2;
printf("aa = %d, bb = %d\n", aa, bb);
swap(&aa, &bb);
printf("aa = %d, bb = %d\n", aa, bb);
return 0;
}
运行结果:
aa = 1, bb = 2
aa = 2, bb = 1
指针的分析3:常量与指针
定义 | 解析 |
---|---|
const int* p | p 可变, p 指向的内容不可变 |
int const* p | p 可变, p 指向的内容不可变 |
int* const p | p 不可变, p 指向的内容可变 |
const int* cosnt p | p 和 p 指向的内容都不可变 |
口诀:左数右指
- 当const 出现在 * 号左边时,指针指向的数据为常量
- 当const出现在 * 号右边时, 指针本身为常量
/* 测试代码 */
#include <stdio.h>
int main()
{
int i = 0;
const int* p1 = &i;
int const* p2 = &i;
int* const p3 = &i;
const int* const p4 = &i;
*p1 = 1; // error
p1 = NULL; // ok
*p2 = 2; // error
p2 = NULL; // ok
*p3 = 3; // ok
p3 = NULL; // error
*p4 = 4; // error
p4 = NULL; // error
return 0;
}