1. 指针的定义:
1.1. 地址:
内存单元的编号;
从零开始的非负整数;
范围:4g【0 -- 4g - 1】0到4g减去1
1.2. 指针:
指针就是地址,地址就是指针
指针变量就是存放内存单元编号的变量,或者说指针变量就是存放地址的变量
指针和指针变量是两个不同的概念;不过在日常中通常叙述的话我们会把指针变量简称为指针;实际上是不同的概念。
指针的本质就是一个操作受限的非负整数。(无法进行四则运算中的加、乘、除)
1.3. 经典案例:互换数字
//新版的C语言标准要求main函数必须有返回值,因此定义成int类型,虽然一些编辑器还是支持void类型,不过不建议使用。
//#include <stdlib.h> //在vs编译器下面 编译c语言 ,输出后自动关闭窗口。在return前面加上system("pause" ); 可以解决这一问题
system("pause");
方法一:
#include <stdio.h>
#include <stdlib.h>
void huhuan(int a, int b)
{
int t;
t = a;
a = b;
b = t;
return;
}
int main(void)
{
int a = 3;
int b = 5;
huhuan(a, b);
printf("a = %d, b = %d\n", a, b);
system("pause");
}
**:这个时候输出的结果是:
这是因为在主函数中输出的仍然是主函数中的局部变量,所以依旧输出的是a = 3, b = 5,
方法二:
void huhuan2(int * p, int * q )
{
int * t;
t = p;
p = q;
q = t;
}
**:这个时候输出的结果是:
这里是因为在这里p, q只是接收a, b的数值,在这里只是改变了形参的数值,实参的数值并没有改变;所有并不会改变其中的数值。
方法三:
void huhuan3(int * p, int * q )
{
int t; //由于p是int *, *p是int型,所以要换数值的话t必须定义成int型
t = *p; //p是int *, *p是int型
*p = *q;
*q = t;
}
**:这个时候输出的结果是:
在这一篇文章点击打开链接中已经提及了关于C语言函数声明的顺序与java的区别,其实在声明函数的时候,
形参的变量名字不是很重要,很多时候我们也可以这样子写:
void huhuan3(int * , int * )只需要写出其数据类型就行了
1.4. * 的三种含义:
1. 乘法
2. 定义指针变量 int * a -- 定义了一个名字叫做a的变量,int *表示a只能存放一个int类型变量的地址
3. 指针运算符: 该运算符放在已经定义好的指针变量的前面;
int * p;
*p = t; *p 表示以p的内容为地址的变量
对于指针变量p,访问其指向的变量时,使用"*"运算符;
1.5. 通过指针可以是被掉函数修改主函数的数值:
1. 实参必须为该普通变量的地址;
2. 形参必须为指针变量;
3. 被掉函数中通过 * 形参名 = 。。。。 的方式可以修改主调函数相关变量的值
void xiugai (int * a, int * b)
{
*a = 2;
*b = 3;
}
int main(void)
{
int a = 3;
int b = 5;
xiugai(&a, &b);
printf("a = %d, b = %d\n", a, b);
system("pause");
return 0;
}
此时的结果将会是: a = 2, b = 3;