C语言-指针(下)


前言

本篇文章紧接着上篇指针内容,为大家讲解C语言指针的的更多知识内容,让大家更好的了解指针,以及可以熟练使用指针来解决实际问题。


一、指针运算

1.指针+-整数

数组在内存中是连续的

 #include <stdio.h>

 int main()

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

int *p= &arr[0];      //&arr[0]==arr
int i = 0;
int j = sizeof(arr)/sizeof(arr[0]);

for(i=0; i<j; i++)

{
printf("%d",*(p+i));       //p+i 这里就是指针+整数

}     
return 0;
}

2.指针-指针

指针-指针的运算前提是两个指针指向了同一空间。

int my_strlen(char*)

{

    char* pl = p;

    while(*p != '\0')

{
    p++;

}

     return p-pl;    //指针-指针
}
int main()

{
     char arr[]= "abcdef"://数组名其实是数组首元素的地址 arr == &arr[0]

     int len = my_strlen(arr);

     printf("%d\n",len);
     return 0;

}

3.指针关系运算

 #include <stdio.h>

 int main()

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

int *p= &arr[0];     
int i = 0;
int  j = sizeof(arr)/sizeof(arr[0]);

while(p<arr+j)    //指针大小比较

{
printf("%d",*p);   

}     
return 0;
}

二、野指针

1.概念

野指针:指针指向的位置是不可知的(随机,不正确,没有明确限制的)

2.野指针的成因

1.未初始化

int main()

{
int* p;     //局部变量:局部变量不初始化时,它的值是随机值

*p = 20;

printf("%d\n",*p);
return 0;

}

2.指针越界访问

 #include <stdio.h>
 int main()
{
int arr[10]={0};

int *p = &arr[0];

int i = 0;

for(i=0; i<=11; i++)

{
*(p++)= i;
 }                    // 当指针指向的范围超出数组arr的范围时,p就是野指针
return 0;

}

3.指针指向的空间释放

#include<stdio.h>
   int* no()

{
    int n=10;

   return &n;

}
 int main()

{
      int*p = no();

     printf("%d\n”,*p);

     return 0;

}

3.避免野指针

1.指针初始化

如果明确知道指针指向哪里就直接赋值地址,如果不知道指针应该指向哪里,可以使用NULL给指针赋值。NULL 是C语言中定义的一个标识符常量,值是0,0也是地址,这个地址是无法使用的,读写该地址会报错。

#include <stdio.h>
int main()

{
int i = 10;

int*pl = &i;

int*p2 = NULL;
return 0;

}

2.小心指针越界


一个程序向内存申请了哪些空间,通过指针也就只能访问哪些空间,不能超出范围访问,超出了就是越界访问。

3. 指针变量不再使用时,及时置NULL

 指针使用之前检查有效性当指针变量指向一块区域的时候,我们可以通过指针访问该区域,后期不再使用这个指针访问空间的时候,我们可以把该指针置为NULL,因为约定俗成的一个规则就是:只要是NULL指针就不去访问,同时使用指针之前可以判断指针是否为NULL。

int main()
{  

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

     int *p= &arr[0];

     for(i=0;i<10; i++)

    {
           *(p++)= i ;
    }                                        //此时p已经越界了,可以把p置为NULL
      P= NULL;                       //下次使用的时候,判断p不为ULL的时候再使用


      p=&arr[0];                     //重新让p获得地址

      if(p != NULL)                  //判断

{

}
      return 0;

}


总结

以上内容为对上篇指针进行了补充和完善,为大家讲解了C语言指针的具体操作和一些注意事项,感谢各位的耐心观看,如果以上内容对大家学习有所帮助的话,希望大家可以点赞支持一下!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值