码迷,mamicode.com
首页 > 编程语言 > 详细

c语言指针运算

时间:2020-06-22 17:26:11      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:而不是   程序   64位   size   其他   --   ror   函数   连续   

1.指针加1

  指针加1表示    指针所指向的地址+sizeof(指针所指数据类型)   的地址

  因此,如果将一个数组a的首地址赋值给一个指针p,*(p+n)和a[n]是等价的

  指针除了+外,还可以++、--、+=、-=、-

2.指针与指针相减

  int p=&a[0];

  int q=&a[6];

  q-p  // 6  指针与指针相减的结果是其地址相减/sizeof(指针所指向的数据类型)

3. *p++

  ++和*都是单目运算符,但是++的优先级比*高

  *p++表示取p所指的变量的内容之后,将指针+1

4.指针比较

  <、<=、>、>=、!=、==都可以对指针做比较

  指针大小的比较实质是地址大小的比较

5.NULL地址

  NULL表示一个预定义的符号,表示0地址

  在程序加载到内存中的时候,有一个逻辑0地址,这个地址是不能被使用甚至不能被读取的,因此可以用0地址/NULL表示空的指针,因而一旦使用空指针,系统会报错

  推荐使用NULL而不是0,因为有的编译器不愿意你用0来表示0地址

6.指针的类型

  无论指向什么类型的指针,所有指针变量所占据的内存的大小都是一样的(我的64位机上占8个字节),但是指向不同类型的指针之间不能互相赋值,假如将char类型指针q赋值给int类型指针q赋值成功,那么*p=0将使连续的四个内存单元的内容变成0,这显然是不合适的。

7.指针的类型转换

  最常用的是void*类型指针转换成其他类型

  如:

    int b=3;   

    int * a=(int*)malloc(sizeof(b));

8.动态内存分配

  C99之前

  int number;

  scanf("%d",&number);

  int *p=(int*)malloc(number*sizeof(int));

  p用完之后记得free(p),假如malloc申请失败,则返回NULL

  C99之后

  int number;

  scanf("%d",&number);

  int p[number];

9.free函数

  malloc内存用完之后记得一定一定要free()

  int *p=(int*)malloc(1*sizeof(int));

  free(p)    //OK

 

  int *p=(int*)malloc(1*sizeof(int));

  p++;

  free(p)    //Error    free只能释放申请的首地址,因此释放的时候不能释放改变后的地址

 

  int *p=NULL;

  free(NULL);  //OK

c语言指针运算

标签:而不是   程序   64位   size   其他   --   ror   函数   连续   

原文地址:https://www.cnblogs.com/foodie-nils/p/13177552.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!