指针【C语言第二个难点】
指针的重要性:C语言的灵魂
表示一些复杂的数据结构
快速的传递数据,减少了内存的耗用
使函数返回一个以上的值
能直接访问硬件
能够方便的处理字符串
是理解面向对象语言中引用的基础
指针的定义
地址:
内存单元的编号
从零开始的非负整数
范围:4G 【0--4G-1】
指针和指针变量
1、指针就是地址,地址就是指针
2、地址就是内存单元的编号、指针变量是存放地址的变量
3、指针和指针变量是两个不同的概念,
但是要注意通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样
指针的本质就是一个操作受限的非负整数
基本类型指针【重点】
{
int * p; // p是变量的名字,int * 表示 p变量存放的是 int 类型变量的地址
// int *p; 不表示定义了一个名字叫做 *p 的变量
// int *p; 应该这样理解: p 是变量名,p变量 的数据类型是 int * 类型
// 所谓 int * 类型 实际就是存放 int 变量地址的类型
int i = 3;
int j;
p = &i;
/*
1、p 保存了 i 的地址,因此 p 指向 i
2、p 不是 i,i 也不是 p,更准确地说,修改 p 的值,不影响 i 的值,修改 i 的值也不影响 p 的值
3、如果一个指针变量指向了某个普通变量,则
* 指针变量 就完全等同于 普通变量
例子:
如果 p是个指针变量,并且p存放了普通变量 i 的地址
则 p 指向了普通变量 i
*p 就完全等同于 i
或者说: 在所有出现 *p 的地方都可以替换成 i
在所有出现 i 的地方都可以替换成 *p
*p 就是以 p 的内容为地址的变量
*/
j = *p; // 等价于 j = i;
printf("i = %d,j = %d\n",i,j);
return 0;
}
附注:
*的含义:
1、乘法
2、定义指针变量
int * p; //定义了了一个名字叫 p 的变量,int *表示p只能存放int 变量的地址
3、指针运算符
该运算符放在已经定义好的指针变量的前面
如果 p 是一个已经定义好的指针变量,
则 *p 表示以p 的内容为地址的变量
如何通过被调函数修改主调函数普通变量的值
1、实参必须为该普通变量的地址
2、形参必须为指针变量
3、在被调函数中通过
* 形参名 = ……
的方式就可以修改主调函数相关变量的值