变量代表一段存储空间的别名,但并不是只能通过变量才能访问一段内存了,指针也可以
1、*号的意义
- 在指针声明时,* 号表示所声明的变量为指针
- 在指针使用时,* 号表示取指针所指向的内存空间中的值
指针 p 里面存放的是变量 i 的地址,*p 表示取变量 i 的值。
p = &i;
*p = i;
为什么指针的大小占用为4个字节?
因为如果系统是32位,地址寻址范围为4个字节,所有的32位地址值都可以用4个字节表示,所以32位系统指针的大小都为4个字节
`
2、传值调用与传址调用
- 指针是变量,因此可以声明指针参数
- 当一个函数体内部需要改变实参的值,则需要使用指针参数
- 函数调用时实参值将复制到形参
- 指针适用于复杂数据类型作为参数的函数中
我记得我当初刚学这里的时候被SWAP函数折磨了很久,现在想来,以前是真的菜,我觉得主要还是要搞懂作用域的问题,我们可以把函数当成一个副本,无论你传值调用怎么去修改值,对我值本身根本没有影响。就像你在桌面上复制一个文档生成一个副本。你在副本里面怎么修改文档,对我原文档是一点影响都没有。
但是传址调用不一样,你用指针交换的时候,真实值就已经改变了。
#include <stdio.h>
//void SWAP(int a, int b) 这段代码是错误的。
//{
// int c = a;
// a = b;
// b = c;
//}
void SWAP(int* a, int* b)
{
int c = *a;
*a = *b;
*b = c;
}
int main()
{
int a = 1;
int b = 2;
printf("a = %d\n", a);
printf("b = %d\n", b);
SWAP(&a, &b);
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}
3、常量指针
const int* p; //p可变,p指向的内容不可变
int const* p; //p可变,p指向的内容不可变
int* const p; //p不可变,p指向的内容可变
const int* const 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;
*p2 = 2; //error
p2 = NULL;
*p3 = 3;
p3 = NULL; //error
*p4 = 4; //error
p4 = NULL; //error
return 0;
}