一、变量与指针
什么是变量?所谓变量,不要浅显的认为会变得量就是变量。套用我们院长的问话:“教室变不变?”变,因为每天有不同的人在里面上课,但又不变,因为教室始终在那,没有变大或变小。这就是变量:有一个不变的地址和一块可变的存储内容。正常情况下,我们只看到变量这个房间里面的东西,也就是其内容,但不会关注变量的地址,但是C语言的指针,就是这个房间的地址。
我们声明变量就相当于盖了间房子存放东西,我们可以直接观看房子里的东西(直接访问)。
当然,也可以通过访问这个房间的地址再取值(间接访问)而声明指针,就是存放该变量的地址。
总的来说:
指针的作用就是:给出一个指针,取出该指针指向地址处的值。
指针类型定义:当一个地址作为一个变量存在时,它就被叫做指针,该变量的类型,自然就是指针类型。
二、函数的值传参与地址传参
值传参(单向的值传递)
1):普通常量、变量作为函数参数
2):数组元素作为函数参数
(数组元素就是下标变量与普通变量并无区别,在发生函数调用时,把作为实参的数组元素的值传递给形参,实现单向的值传递)
例如:判断一个整数数组中各个元素的值,大于0输出该值,小于0赋值为0。
地址传参:()
1)数组名作为函数参数
注意:用数组名作为函数参数时,形参与实参数组类型不一致会发生错误。
在用数组名作为函数参数时,不是进行值的传递,而是首地址的传送,形参数组取得该首地址后与实参数组存储空间相同。
2)指针作为函数参数
1.1、值会改变
变量的内容固定,只改变指针的指向
1.2、值不会改变(实参与形参都是指针变量)
备注:(即使函数是地址传递,形参指针指向的变化不会影响到实参指针的指向)
因为实参指针与形参指针分别代表不同的指针,这里是只是将实参指针指向的地址传递给形参指针,使实参指针与形参指针指向同一个地址,故形参指针指向的变化不会影响到实参指针。
注意:调用指针变量,实参传递给形参的是变量的地址,虽然他们是不同的指针(即形参指针指向改变无法影响实参指针指向),但他们指向同一个存储单元,如果形参指针改变变量地址里的值,实参指针指向的值也就变了。
(例如:我所在班级为1班,小王和老赵是1班的实习数学老师和数学老师。那么老赵是实参指针,小王是形参指针,1班就是共同的地址。有一天,小王去2班教课了,小王的地址变了,可影响不到老赵教的1班,即形参指针指向改变无法影响实参指针指向。但是,要是小王在1班实习时骗走了2个学生,那么老赵和小王所指的共同地址内容就变了。)
三、指针与数组
#include<stdio.h>
int main(void)
{
int a[2][3] = { {1,2,3},{4,5,6} };
int *p=a;
}
无法从“int [2][3]”转换为“int *”
a在这里代表的是二维数组的行首地址, 单纯的*p是一个只能指向一维数组的指针
二维数组定义:数组的数组
float rain[2][3]; 内含2个数组元素的数组,每个数组元素内含3个float类型的元素。
此时可以想象出一个2*3的矩阵,这个二维数组由两个一维数组组成,每个一维数组内含3个float类型的元素.
-——>:rain代表二维数组的行首地址;rain[0]与rain[1]是内含3个float值的一维数组,即rain[0]为一维数组的首地址,那么rain[0][0]是一个float类型的值。
由此可以知道:
int main(void)
{
int a[2][3] = { {1,2,3},{4,5,6} };
int *p=a[0]; // 二维数组中第一行的一维数组的首地址
//int *p=&a[0][0];
}
此外还可以定义一个数组指针; (数组指针是指向数组地址的指针,其本质为指针)
int *p[3] =a;