指针与数组

 指针

         为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。

数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量

 

在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;//注意取地址符号的使用

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值