c语言中“指针的运算”以及“野指针”assert断言

指针的运算:

1:指针+-整数

例如:若是按照下标的方式进行打印出数组

int arr[10]={1,2,3,4,5,6,7,8,9,0};

int  sz = sizeof(arr)/sizeof(arr[0]);

  for(int i=0;i<sz;i++)

  {

       printf("%d ",arr[i]);

  }

也可以按照指针的方式进行打印:

int *p=&arr[0];

for(int i=0;i<sz;i++)

{

      printf("%d ",*p);

     p++;

}

还可以:

           int *p=&arr[0];

          while(p<&arr[sz])

          {

                   printf("%d ",*p);

                   p++;

         }

//因为是整形,所以*p解引用得到4个字节,

1:指针的类型决定指针+1的步长,决定指针解引用权限

2:指针在内存中是连续

也可以改为减的:

int *p=&arr[sz-1];

for(int i=0;i<sz;i++)

{

printf("%d ",*p);

p--;

}

2:指针-指针

指针-指针的绝对值(因为有正负之分)是指针和指针之间的元素的个数

计算前提条件:两指针指向的是“同一空间”

例如:int arr[10]={0,1,2,3,4,5,6,7,8,9};

           printf("%d ",&arr[9]-&arr[0]);  //回车得到的是9。

//元素之间相差为9,所以最后打印出的值为9.

求字符串长度:strlen是求\0之前的字符串长度

int main()

{

char arr[]="abcdef";

size_t   len=my_strlen(arr);//调用函数进行求解字符串的长度

printf("%zd\n",len);

return 0;

}

普通求法:size_t  my_strlen(char *p){    //size_t是一种无符号整形

                  int count =0;

                 while(*p!='\0') 

                 {     //知道p一直数到\0.

                      count++;

                 }

                  return count;}

指针-指针的方式:

size_t  my_strlen(char *p){

         char *start=p;

         char *end=p;

         while(*end!='\0')

        {

                end ++;

         }   //令其数到最后

return end-start;}

野指针:

指针指向的位置是不可知的(随机的,不正确的)

例如:int main(){

              int *p;  //一个局部变量不初始化,它就是随机的

             *p=20;   //就是野指针 

         return 0;}

 以上的p是局部变量,但是未初始化,其值是随机的,若是将p存放的值当作地址,解引用操作符会形成非法访问

如何避免野指针?

如果明确知道指针指向哪里直接赋值,如果不知道指针指向哪里,可以赋值NULL

例如:

int  a=10;

int *p=&a;

int *p2=NULL;//不可进行解引用操作

*p2=200;  //错误写法,引发异常。

assert断言

assert.h头文件中定义了宏assert()用于运行时确保了程序符合指定条件,若是不符合就报错终止运行,这个宏常被称为“断言”

例如:#include<assert.h>

int main()

{

int *p=NULL;

assert(p!=NULL);  //因为为假,所以会报错

}

所以assert接受表达式为的话assert()不会产生任何作用,程序继续运行

若是表达式为假,assert()就会报错

assert不仅可以自动识别文件和出现的问题行号,还有一种无需更改代码就能开启和关闭的assert机制

在Debug中使用,在release中可选择禁用assert

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值