C语言指针秘籍(小白都可以看懂的)

相信很多人都觉得C语言指针很难很复杂,用处很大,无处下手,下面允许我分享一下C语言指针。
指针(pointer)的解释就是:存放地址的变量。
指针有自己的类型,举几个例子,有:int* char* ,short* , double*.
用简单代码说明一下指针怎么用的;

int main()
{
  int a=10;
  int* p=&a;//在这里p就是一个指针变量,主要作用,存a的地址。
  //我们可以打印一下a的地址,是一个随机地址
  printf("%d\n",p);
  //在这里说明一下*p是什么,其实是解引用操作,不多解释,代码打印一下
  printf("%d\n",*p);
return 0;
}

我们来看一下结果:
当然这里是一个随机地址,不必纠结,在这里只要知道:指针是可以存放地址的变量就可以了。在这里插入图片描述
当然这里是一个随机地址,不必纠结,在这里只要知道:指针是可以存放地址的变量就可以了。
在这里插入图片描述

通过这里的结果可以看出 *p的值刚好也等于10.也就是说 *p是对应p指针所指位置的值。

这里我们大体明白了,C语言的指针是怎么回事,我们继续探究一下,指针类型的问题。我们这是想到数据类型,那么这些指针在我们计算机中占多少个字节呢:
这里不给大家展示怎么去求了,提醒一下可以借助sizeof这个函数。结果我们发现,在32位地址线中,这些指针类型都占用4个字节。这时有人就有疑问了,同样都是4个字节,我们为什么还会分int* ,char* ,double*,short*这些指针类型呢?下面我们来用代码探讨一下。

int main()
{
int a=0x11223344;//16进制地址,其他整数也可以
int* p=&a;
*p=0;
printf("%d\n",a);
return 0;
}
   我们通过调试代码,可以发现,四个字节全部变成了0;

在这里插入图片描述
在这里插入图片描述

调试发现:int类型4个字节全部变成了0;
下面我们来探究一下char
的特点,代码演示。

int main()
{
int a=0x11223344;
char* p=&a;
*p=0;
printf("%d\n",a);
return 0;
}

我们通过调试代码发现:一个字节变成了0;
在这里插入图片描述
在这里插入图片描述
调试发现:char*改变了一个字节的值。

其他指针类型可以运用同样的方法来尝试。我这里给大家总结一下。

  1. int* p :*p能够访问4个字节。
  2. char* p :*p能够访问1个字节。
  3. double* p :*p能够访问8个字节。
  4. short* p :*p能够访问2个字节。

所以我们说明了,指针类型有几种的一个意义。
下面我们来讨论指针类型的下一个意义:

即:指针类型决定了,指针走一步可以走多远。(指针加整数)
先把结论说一下:

  1. int* p: p+1说明加了4个字节。
  2. char* p:p+1说明加了1个字节。
  3. double* p:p+1说明走了8个字节。
  4. short* p:p+1说明走了2个字节。

下面我们用代码来感受一下:

int main()
{
int a=10;
int* p=&a;
char* q=&a;
printf("%d\n",p);
printf("%d\n",p+1);
printf("%d\n",q);
printf("%d\n",q+1);
return 0;
}

我们来看一下结果并分析:
在这里插入图片描述
int* 型指针p的原值为:12057620 p加1后变为:12057624.
char*型指针q的原值为: 12057620 q加1后变为: 12057621
很明显证明了我们的结论。
这里简单说一下:通过上面的例子我们也可以看出来,指针是可以进行运算的。

  1. 指针可以加减整数
  2. 同类指针可以相减,结果是什么呢?一会通过代码演示一下。(大减小)
  3. 指针可以进行关系运算。

我们来演示一下2的结果(同类指针相减的结果)

#include<stdio.h>
int main()
{
int arr[9]={1,2,3,4,5,6,7,8,9};//一维数组。
int* p=arr;//指针p存储的是数组首元素的地址
int* q=arr[8];//同上
printf("%d\n",q-p);
return 0;
}

结果展示:
在这里插入图片描述
结果是8,我们来分析一下8这个数据说明了什么?
在这里插入图片描述
这里我简单画了一个数组,绿色线指向每个元素对应的地址,0地址到8地址里面包含了8个元素,1,2,3,4,5,6,7,8这8个元素。
我们通过代码的运算可以得出同类指针相减得到之间的元素个数
在这里基本介绍了指针是怎么一回事。下面我们来讨论一下野指针
什么是野指针呢?在生活中我们知道有 野猫、野狗之类的说法,所谓野猫野狗就是没有主人的猫和狗。
我们可以类似到野指针这里。
野指针:就是指针指向的位置是不可知的。(比如:随机的,不正确的,没有有明确限制的)

下面举几个是野指针的例子:
1、未初始化。

int main()
{
//未初始化指针
int* p;//局部变量不初始化,里面默认放的是随机值。
*p=20;//这就是解引用操作
return 0;
}

这段代码试运行不出来会报错的。
2、越界(指针超出范围)数组越界。
指针超出数组的范围,比如上面在证明同类指针相减得到中间元素个数那个例子中,如果q指针的地址存储的是10的话,说明指针q已经越界了。
3、指针指向的空间被释放了
比如,在自定义函数时,数组在局部运行完之后,所用的内存会还给操作系统,即地址已经销毁,主函数中不能再相那个地址发送请求。
怎么样可以避免野指针呢???

  1. 当初始化一个指针时,不知道是具体值时,令其为NULL;
  2. 避免越界;
  3. 不想用指针时,置为NULL;
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值