C的一些基本指针操作

 

指针操作
一些关于指针用到操作,c提供来6种基本到指针操作,我用一段代码实现这6种操作,源码如下

// ptr_ops --指针 操作
1.#include<stdio.h>
2.int main(void)
3.{
4.   int urn[5] = {100,200,300,400,500};
5。
6.   int *ptr1,*ptr2,*ptr3;
7.
8.   ptr1 = urn;       //把第个地址赋给指针
9.   ptr2 = &urn[2];   //同上
10.
11.  printf("pointer value ,dereferenced pointer ,pointer address:/n");            //取得指针到值并去取得指针到地址
12.  printf("ptr1 = %p,*ptr1 = %d,&ptr = %p/n",ptr1,*ptr1,&ptr1); //ptr1 = %p
13.  ptr3 = ptr1 + 4;                                                              //指针加法
14.  printf("/nadding an int  to a pointer :/n");
15.  printf("ptr1 + 4 = %p,*(ptr1 + 3) = %d/n",ptr1 + 4,*(ptr1 + 3));
16.  ptr1++;                                                                       //递增指针
17.  printf("/nvalues after ptr1++/n");
18.  printf("ptr1 = %p,*ptr1 = %d,&ptr1 = %p/n",ptr1,*ptr1,&ptr1);               
19.  ptr2--;                                                                       //递减指针
20.  printf("/n values after --ptr2/n");
21.  printf("ptr2 = %p,*ptr2 = %d,&ptr2 = %p/n",ptr2,*ptr2,&ptr2);
22.  --ptr1;                                                                       //恢复初始值
23.  ++ptr2;                                                                       //恢复初始值
24.  printf("/npointer reset to original values/n");
25.  printf("ptr1 = %p,ptr2 = %p/n",ptr1,ptr2);
26.  printf("/nsubtracting one pointer from another /n");
27.  printf("ptr2 = %p,ptr1 = %p ,ptr2 - ptr1 = %d/n",ptr2,ptr1,ptr2 - ptr1);      //指针减法   
28   printf("/nsubtracting an int from a pointer/n");
29.  printf("ptr3 = %p,ptr3 - 2 = %p/n",ptr3,ptr3 - 2);
30.  return 0;    
31.}

在linux中到运行结果如下:
/home/think/foobar-sample1/Debug/src/foobar_sample
----------------------------------------------
pointer value ,dereferenced pointer ,pointer address:
ptr1 = 0xbfd52840,*ptr1 = 100,&ptr = 0xbfd5285c

adding an int  to a pointer :
ptr1 + 4 = 0xbfd52850,*(ptr1 + 3) = 400

values after ptr1++
ptr1 = 0xbfd52844,*ptr1 = 200,&ptr1 = 0xbfd5285c

 values after --ptr2
ptr2 = 0xbfd52844,*ptr2 = 200,&ptr2 = 0xbfd52858

pointer reset to original values
ptr1 = 0xbfd52840,ptr2 = 0xbfd52848

subtracting one pointer from another
ptr2 = 0xbfd52848,ptr1 = 0xbfd52840 ,ptr2 - ptr1 = 2

subtracting an int from a pointer
ptr3 = 0xbfd52850,ptr3 - 2 = 0xbfd52848

----------------------------------------------
Program exited successfully with errcode (0)
Press the Enter key to close this terminal ...

下面分析代码:
1.赋值(assignment) ;  代码第8行和第9行分别将数组第一个元素与第三个元素地址赋给pt1和pt2,通常可以是使用数组名或者地址运算符&进行地址赋值,代码中数组起始地址被赋予pt1,该地址到编号为0xbfd52840到内存单元(见运行结果),同理数组到第三个元素(urn[2])地址赋给pt2,注意地址类型应该于数组到类型兼容也就是相同 ,不能把一个double类型的地址赋值给一个int类型到指针。
2 求值(value-finding)或取值(dereferencing) : 运算符 * 可以取出指针所指向到地址中存储到数值,因此代码中 ,*ptr1 = 100 (见运行结果)及为数组中第一个元素,即是地址0xbfd52840中到值。
3 取地址值  : 我们应该理解指针也是一个变量 ,所以指针变量同其他变量一样也具有地址和数值,使用&运算符可以得到指针本身的地址,代码中 ptr1 被存储在内存地址0xbfd5285c中(见运行结果),也就是说0xbfd5285c为ptr1这个指针变量到地址信息,该内存单元的内容是0xbfd52840,即urn到地址信息。
4 将一个整数加给指针 : 使用 + 运算符可以将一个整数加给指针,或者把一个指针加上一个整数,两种情况下整数都会和指针所指到内型到字节数相乘,然后把得到的结果加在初始地址上,可能有人不太理解,指针到同整数进行操作是 +1 代表移动一个存储单元 到下一个存储单元,如代码中 int的一个存储单元是4 ,所以ptr +4 等于ptr寻址但&urn[4],即最后一个元素地址,移动了四个int类型的单元。注意,如果相加的结果超出指针所指向到数组到范围,那么得到到结果将是不确定的。
5,增加指针到值 :可以通过一般到加法或增量运算符俄增加一个指针的值,进行操作后指针将指向该数组的下一个元素,代码中ptr1++ 即使指针从第一个元素指向第二个元素,地址是0xbfd52844(见运行结果)值为*ptr1 =200,注意此时ptr1本身的地址仍然是 0xbfd5285c,并没有发生变化(变量不会因为它到值到变化而移动位置!)。
6. 求差值(Differencing) : 代码中ptr2 - ptr1 = 2 即时求差值,2 代表指针所指向对象之间的距离为2个int类型到大小,换句话两个int类型到存储单元。有效到指针求差值运算前提是参加运算的两个指针所指向到对象是同一个数组,(其中一个指向数组后面的第一个地址,因为数组后面到第一个地址在c中也是有效的 ,(但是我还没有试过)!),如果指向的不同到两个数组又进行来指针间到差值运算,那么结果将是未知到,但肯定不是一个好结果!!
基本就是这些了 ,一些简单到理解,还不够深入,废话较多,不够简练,有错望指出!!!



     (练习&&时间) == 完美 !!!!
 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值