当前位置:网站首页>详细讲解C语言11(C语言系列)
详细讲解C语言11(C语言系列)
2022-06-26 12:37:00 【奶油酒窝*٩(ˊωˋ*)و*】
目录
前言:
这次小编将会和大家分享一下指针方面的一些知识,虽然指针相对于前面的知识来说学一起来可能会有些困难,但是不要害怕跟着小编一起来走进指针的世界吧!
指针:
什么是指针:
在内存中每一块空间都会有一个编号,其中编号就是地址,地址也就是指针。(编号----地址----指针)
指针的大小:
指针在32位平台上是4个字节,在64位平台上是8个字节。
指针类型的意义:
指针也是有类型的,那么这些类型又都又什么意义呢?
1.指针类型决定了指针解引用的权限有多大。
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int* pa;
char* pc;
float* pf;
printf("%d\n", sizeof(pa));
printf("%d\n", sizeof(pc));
printf("%d\n", sizeof(pf));
return 0;
}代码运行截图如下所示:
2.指针类型决定了指针走一步能走多远(步长)。
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int* p = arr;
char* pc = arr;
printf("%p\n", p);
printf("%p\n", p + 1);
printf("\n");
printf("%p\n", pc);
printf("%p\n", pc + 1);
return 0;
}代码截图如下所示:

野指针:
野指针就是指指针指向的位置是不可知的。
野指针的成因:
1.指针未初始化
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//代码不可运行
int main()
{
int* p;
*p = 20;//未初始化
return 0;
}2.指针越界
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int* p = arr;
int i = 0;
for (i = 0; i <= 10; i++)
{
*p = i;
p++;
}
return 0;
}代码运行截图如下所示:
发生越界显示如下:

3.指针指向的空间释放了
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int* test()
{
int a = 10;
return &a;
}
int main()
{
int* p = test();
*p = 20;//修改值的时候a的空间已经释放了
return 0;
}如何避免野指针:
1.指针初始化
当不知道初始化为什么时初始化为NULL。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int* p = NULL;
return 0;
}明确知道初始化的值。
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 20;
int* p = &a;
*p = 10;
printf("%d\n", *p);
return 0;
}代码截图如下所示:

2.小心指针越界
在C语言中是不会检查数组越界行为的。
3.指针指向空间释放即时置NULL
4.指针使用前检查它的有效性
指针运算:
1.指针+-整数
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;
int* pend = arr + 9;
while (p <= pend)
{
printf("%d\n", *p);
p++;
}
return 0;
}代码截图如下所示:

2.指针-指针
指针-指针得到的是两个元素之间的个数。
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d\n", &arr[9] - &arr[0]);
return 0;
}代码截图如下所示:

指针和指针相减的前提是两个指针指向同一块空间。
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//实现一个计算字符长度的函数
int my_strlen(char* str)
{
char* start = str;
while (*str != '\0')
{
str++;
}
return str - start;
}
int main()
{
int len = my_strlen("abc");
printf("%d\n", len);
return 0;
}代码运行截图如下所示:
3.指针的关系运算
标准规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

指针和数组:
数组名是数组首元素的地址。
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
printf("%p\n", arr);//数组名
printf("%p\n", &arr[0]);//数组的首地址
return 0;
}代码如下截图所示:

二级指针:
解释见代码,代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 10;
int* pa = &a;//此处的pa就是一级指针
int** ppa = &pa;//此处的ppa就是二级指针
int*** pppa = &ppa;//此处的pppa就是三级指针
return 0;
}

指针数组:
数组也是有指针的,下面小编给大家浅浅的介绍一下指针数组的格式吧。
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[10];
char ch[5];
int* paar[5];//整形数组指针
char* pch[5];//字符型数组指针
return 0;
}结束语:
这次小编就分享到这里啦!如果想要看C语言其他系列的,点击下面的链接哦!希望对大家有所帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)
边栏推荐
- guacamole安装
- 栈,后入先出
- QT .pri 的建立与使用
- NoSQL mongodb - 01 introduction to NoSQL and mongodb
- 小程序中控件里面的内容较多,让其支持滚动的良好方案
- [esp32-C3][RT-THREAD] 基于ESP32C3运行RT-THREAD bsp最小系统
- PHP unit conversion
- Several methods added to the ES6 array (foreach, filter, some, every. Includes, reduce)
- 做自媒体视频的各种常用工具合集奉上
- Software testing - Fundamentals
猜你喜欢
随机推荐
Iframe usage and contentwindow, parent and PostMessage communication methods
File remote synchronization and backup artifact Rsync
Deeply analyze the differences between dangbei box B3, Tencent Aurora 5S and Xiaomi box 4S
美学心得(第二百三十八集) 罗国正
el-form-item 包含两个input, 校验这两个input
5+API,清除应用缓存
Wechat applet wx Request request encapsulation
The laravel dingo API returns a custom error message
国标GB28181协议EasyGBS级联宇视平台,保活消息出现403该如何处理?
自动化测试的局限性你知道吗?
Thinkphp5 query report: sqlstate[hy093]: invalid parameter number
深度解析当贝盒子B3、腾讯极光5S、小米盒子4S之间的区别
Introduction to the four major FPGA manufacturers abroad
7-1 n皇后问题
Several methods added to the ES6 array (foreach, filter, some, every. Includes, reduce)
.NET MAUI 性能提升
Adobe Acrobat阻止30款安全软件查看PDF文件 或存在安全风险
自定义封装下拉组件
使用SSH密钥对登陆服务器
软件测试 - 基础篇



![[极客大挑战 2019]RCE ME 1](/img/66/e135f7e5a7cbdeb5b697f3939a3402.png)


![[esp32-C3][RT-THREAD] 基于ESP32C3运行RT-THREAD bsp最小系统](/img/4a/503240b332e3279047c438f1d9845e.png)


