c高级之指针1

1指针:
*指针的实质就是个变量,它跟普通变量没有任何区别,指针完整的名字是:指针变量。
int a与int *p 中a与p绑定的内存空间都是4个字节

指针出现是为了间接访问(cpu间接寻址是cpu设计时决定的)


%p与%x打印指针,打印出的值是一样的


下面四种在效果上是一样的,编译器不会报错:

int *p1 //定义多个是更好理解:int *p1,*p2.---------定义两个指针。

                                                               int *p1,p2和int* p1,p2效果相同-----------定义一个int指针一个int类型

int*p2
int * p3
int* p4


        *放在运算符左边的就是左值,右边的就是右值.
当为左值时:代表内存空间,不关注空间里的值
当为右值时:代表内存空间里的值
2野指针:
野指针:指针指向的位置是不可知(随机的,不正确的,没有明确限制的)
野指针和可能触发运行时的段错误(sgmentation fault)
野指针触发错误原理:指针变量在定义时,如果没有初始化,值是随机分配的,即指针变量的值是随机一个变量的地址(这个变量可能不能被访问.....)
野指针指向地址的三种情况:1指向不可访问。2指向可用且无意义。3指向可用但已经被用的空间。


避免野指针的常规做法:
第一步:定义指针时,同时初始化为NULL
第二步:在指针解引用之前,先判断这个指针是不是NULL
第三步:指针使用完之后,将其赋值为NULL
第四步:指针使用前,将其赋值。


NULL:本质是(void*)0,作为一个特殊的地址。在一般操作系统中这个地址是不可以被访问的。解引用会触发段错误。
     
        判断指针是否为NULL时,都写成if(NULL!=p)
而不是if(p!=NULL)
原因是:当中间用的是==时,在错误的写成=后,这时候编译器是不会报错的,很难查出来。当把NULL写前面时,错写成=时,就会报错。
3const:
const:在C语言中,用来修饰变量,表示这个变量是常量。


1-:const int *p        :p指针指向一个const int型,p本身不是const,p指向的才是
2-:int const *p        :同上
3-:int * const p       :p指针指向一个int型,p本身就是const。
4-:const int * const p :p指针指向一个const int,p本身就是const.


const修饰的变量其实是可以改的(前提是gcc环境下)使用指针赋值:
int main(void)
{
const int a=5;
int *p;
p=&a;//编译器会有警告,可以通过p=(int *)&a;通过欺骗编译器,来消除编译器报错
*p=6;
printf("a=%d\n",a);
return 0;
  }

const是通过编译器在编译时执行检查来确保实现的(即const类型的变量不能改,是编译错误,不是运行错误),所以我们只要骗过编译器,就可以修改const定义的常量,而运行时不会报错。
const更多时候是一种信息的传递,告诉编译器,也告诉读程序的人,这个变量是不应该被修改的。


4指针与数组:
对编译器来说:数组变量也是变量,和普通变量和指针变量木有本质不同,变量的本质就是一个地址,这个地址在编译器中决定具体数值,具体数值和变量名绑定,变量类型决定这个地址的长度


对于int a[10];来说:a是首元素的首地址,a=&a[0];
   &a是数组名a取地址,做右值时就是整个数组(将数组看成一个变量)的首地址

* &a与a做右值时的区别:&a是整个数组的首地址,而a是数组首元素的首地址,虽然二者在数值上是相等的,但是意义不相同(会导致他们参与运算时会有不同的表现--详细见后续)


int *p;
int a[10];  :p=&a;//会报错因为p与&a的类型不一样,p是int *类型,&a是int (*)[10]类型
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值