指针
为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。
数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。
在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。指针变量的值就是某份数据的地址,这样的一份数据可以是数组、字符串、函数,也可以是另外的一个普通变量或指针变量。
给指针赋值的时候,变量一定要带&取地址符,因为指针指向的是地址
Float b;
Float * p =&b;
Float *q;
Float a;
P = &a; //给指针变量本身赋值时不能加上*
*P = 100; //*用来获取指针指向的数据
P = q ; //把一个指针赋值给另一个指针
注:定义指针变量时必须带*
,给指针变量赋值时不能带*
。P本身为地址,*p为变量值
我们将内存中字节的编号称为地址(Address)或指针(Pointer)。地址从 0 开始依次增加,对于32 位环境,程序能够使用的内存为 4GB
下面的例子演示了如何以指针的方式遍历数组元素:
1. #include<stdio.h>
2.
3. intmain(){
4. int arr[]={99,15,100,888,252};
5. int len=sizeof(arr)/sizeof(int); //求数组长度
6. int i;
7. for(i=0; i<len; i++){
8. printf("%d ",*(arr+i)); //*(arr+i)等价于arr[i]
9. }
10. printf("\n");
11. return0;
12.}
运行结果:
99 15 100 888 252
注:第 5行代码用来求数组的长度,sizeof(arr)会获得整个数组所占用的字节数,sizeof(int) 会获得一个数组元素所占用的字节数,它们相除的结果就是数组包含的元素个数,也即数组长度。
1. for(i=0; i<len; i++){
2. printf("%d ",*(p+i));
3. }
1. for(i=0; i<len; i++){
2. printf("%d ",*p++);
3. }
1. int*p=&arr[2]; //也可以写作 int *p = arr +2;
2.
3. printf("%d, %d, %d, %d, %d\n",*(p-2),*(p-1),*p,*(p+1),*(p+2));
关于数组指针的谜题
假设 p是指向数组 arr 中第 n 个元素的指针,那么 *p++、*++p、(*p)++ 分别是什么意思呢?
*p++ 等价于 *(p++),表示先取得第 n 个元素的值,再将 p 指向下一个元素,上面已经进行了详细讲解。
*++p 等价于 *(++p),会先进行 ++p 运算,使得 p 的值增加,指向下一个元素,整体上相当于 *(p+1),所以会获得第 n+1 个数组元素的值。
(*p)++ 就非常简单了,会先取得第 n个元素的值,再对该元素的值加 1。假设 p 指向第 0 个元素,并且第 0 个元素的值为 99,执行完该语句后,第 0 个元素的值就会变为 100。
用数组作函数参数
数组是一系列数据的集合,无法通过参数将它们一次性传递到函数内部,如果希望在函数内部操作数组,必须传递数组指针
1. intmax(int intArr[6],int len){//intintArr[]||int *intArr都是一样
2. int i,maxValue= intArr[0]; //假设第0个元素是最大值
3. for(i=1; i<len; i++){
4. if(maxValue< intArr[i]){
5. maxValue = intArr[i];
6. }
7. }
8. return maxValue;
9. }
不管是int intArr[6]
还是int intArr[]
都不会创建一个数组出来,编译器也不会为它们分配内存,实际的数组是不存在的,它们最终还是会转换为int *intArr
这样的指针。这就意味着,两种形式都不能将数组的所有元素“一股脑”传递进来,大家还得规规矩矩使用数组指针。
需要强调的是,不管使用哪种方式传递数组,都不能在函数内部求得数组长度,因为intArr仅仅是一个指针,而不是真正的数组,所以必须要额外增加一个参数来传递数组长度。
指针函数:
C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数。
如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。
假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示:
将这种关系转换为C语言代码:
1. int a=100;
2. int*p1=&a;
3. int**p2=&p1;
C语言不限制指针的级数,每增加一级指针,在定义指针变量时就得增加一个星号*
。p1是一级指针,指向普通类型的数据,定义时有一个*
;p2是二级指针,指向一级指针p1,定义时有两个*
。
1. int a =100;
2. int*p1=&a;
3. int**p2=&p1;
4. int***p3=&p2;//注意取地址符号的使用