C语言指针详解上

news2024/11/24 9:47:49

1 野指针

int main01()

{

//野指针就是没有初始化的指针,指针的指向是随机的,不可以 操作野指针

//int  a = 0;

//指针p保存的地址一定是定义过的(向系统申请过的)

int  *p;//野指针

*p = 200;

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

system("pause");

return 0;

}

2 空指针

空指针的作用: 如果使用完指针将指针赋值为NULL,在使用时判断一下指针是否为NULL,就知道指针有没有被使用

int main()

{

int  a;

//将指针的值赋值为0,0x0000000 =  NULL

int  *p = NULL;//给指针p的内容赋值为0

*p = 200;//err  因为p保存了0x0000的地址,这个地址是不可以使用的,非法

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

system("pause");

return 0;

}

3 万能指针

万能指针就是可以保存任意的地址

//万能指针

int main()

{

//void b; 不可以定义void类型的变量,因为编译器不知道给变量分配多大的空间

//但是可以定义void *类型,因为指针都是4个字节

int  a = 10;

short b = 10;

void *p = (void *)&a;//万能指针可以保存任意的地址

void  *q = (void *)&b;

//printf("%d\n", *p);//err  p是void*,不知道取几个字节的大小

printf("%d\n",* (int *)p);// *(  (int *)地址)

system("pause");

return 0;

}

4 const修饰的指针变量

int main()

{

int  a = 10;

int  b = 20;

//const修饰的是 * 还是变量p,

//这里修饰的是*

//const int  *p = &a;//不能通过 *p,改p所指向空间的内容

//*p = 100; err  因为不能通过p改p所指向空间的内容

//const修饰的变量p

//p保存的地址不可以修改

//int  * const p = &a;

//p = &b;err  p本身的值不能被更改

const  int *const p = &a;//p本身的指向不能改变,不能通过*p修改p

//向那块空间的内容

system("pause");

return 0;

}

5 多级指针

定义多级指针保存数据的地址时,定义的指针的类型只需要比要保持的数据的类型多一级*

//多级指针

int main()

{

int a = 10;

//*p  int a     int *p

int *p = &a;

//*q  int *p   int **q

int **q = &p;

//如果*和&相遇,相抵消

// **q == *(*q) == *(p) ==  a

//**q == *(*q) == *(&a) ==  a

printf("%d\n", **q);

// *k  int **q  int ***k

int ***k = &q;

//*符号结合,代表这个k是一个指针变量

//k是一个变量

//k的类型,将变量k拖黑,剩下的类型

//k用来保存谁的地址  将变量k和k最近的*一起拖黑,剩下什么类型

//就保存什么类型数据的地址

int *******************g;

int ********************f = &g;

system("pause");

return 0;

}

6 指针结合数组

指针加1,跨过一个步长

int  *p;

步长  =  sizeof(int)

要得到内存的数据,就该先得到数据的地址

- (地址) 得到的是地址里面的内容

int main()

{

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

int  a[10] = { 0 };

//a 数组名,首元素的地址

int  *p = a;//指针p保存的是首元素的地址

for (int i=0;i<sizeof(a)/sizeof(a[0]);i++)

{

//printf("%d ",a[i]);

//printf("%d ", *(p+i));

*(p + i) = i;

}

for (int i = 0; i<sizeof(a) / sizeof(a[0]); i++)

{

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

//printf("%d ", *(p+i));

//*(p + i) = i;

}

system("pause");

return 0;

}

7 指针运算

两指针(类型一致)相减,得到的是中间跨过多少元素

两指针相加没有意义

int main()

{

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

//sizeof(int [10])

int *p = a;

//int  *q = (int *)(&a + 1) - 1;

int  *q = &a[9];

printf("%d\n",q-p);//  p+9 ==  q

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

//两指针相加没有意义

// printf("%d\n", p+q);err

system("pause");

return 0;

}

8 并不是数组的专属

[]==  *()

int main()

{

//[] == *()

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

int *p = a;

for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)

{

//printf("%d ",a[i]);//a[i] == *(a+i)

//printf("%d ", *(p+i));

//printf("%d ", p[i]);// p[i]  == *(p+i)

printf("%d ", *(a + i));

}

system("pause");

return 0;

}

int main09()

{

//[]是不是数组的专属

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

//  []  ==  *()

//p[0]   ==  *(p+0)

int a = 10;

int *p = &a;

p[0] = 100;

//p[1] = 200;

printf("a=%d\n",a);

system("pause");

return 0;

}

9 指针数组

整型数组 是一个数组,数组的每一个元素是整型

指针数组 是一个数组,数组的每一个元素都是一个指针

int main()

{

int a = 10;

int b = 20;

int c = 30;

// int *p1 = &a  int *p2 = &a  int *p2 = &a

//需求:  数组中的每一个元素都是指针(地址)

int *num[3] = {&a,&b,&c};

//printf("%d\n",sizeof(num));

&a  ==  num[0]

//for(int i=0;i<sizeof(num)/sizeof(num[0]);i++)

//{

// printf("%d\n",*num[i]);

//

//}

//定义一个指针用来保存数组num首元素的地址

// num ==  &num[0] =   &(int *)  == int **

//num[0]是int *类型,要保持int  *类型的地址,需要比它多一级*

int **k = num;

for (int i = 0; i < sizeof(num) / sizeof(num[0]); i++)

{

printf("%d ",**(k+i));

}

system("pause");

return 0;

}

在这里插入图片描述

10 指针作为函数的形参

指针作为函数的形参,可以改变实参的值

void swap2(int*x, int *y)

{

int  k = *x;

*x = *y;

*y = k;

printf("x=%d y=%d\n", *x, *y);

}

int main()

{

int  a = 10;

int b = 20;

//swap(a,b);

swap2(&a, &b);

printf("a=%d b=%d\n", a, b);

system("pause");

return 0;

}

在这里插入图片描述

11 数组作为函数的形参

//数组作为函数的形参会退化为指针

//void print_arr(int b[10]) // int  *b

//void print_arr(int b[1000])//int  *b

void print_arr(int *b,int  len)

{

int  n = sizeof(b) / sizeof(b[0]);  // *(b+0)  == *b

printf("n=%d\n",n);

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

{

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

}

printf("\n");

}

int main()

{

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

print_arr(a,sizeof(a)/sizeof(a[0]));//打印数值的内容//  &a[0]   int *

system("pause");

return 0;

}

12 指针作为函数的返回值

int num = 0;//在函数外面定义的变量叫全局变量,整个工程都可以使用

//整个变量程序启动开辟空间,直到程序结束释放空间

int * getnum()

{

//{}中定义的变量叫局部变量,局部变量在函数结束之后的空间会被释放

srand(time(NULL));

num = rand();

return &num;//

}

int main()

{

int * p = getnum();

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

system("pause");

return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1292725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity 关于Ray、RaycastHit、Raycast及其使用

Unity中&#xff0c;我们要进行物理模拟和碰撞检测时&#xff0c;有三个重要的概念Ray、RaycastHit、Raycast。 其中&#xff0c;Ray可以理解为射线&#xff0c;它是一条从起点沿着特定方向延伸的无限长线段。 它的语法是&#xff1a; Ray(Vector3 origin, Vector3 directio…

使用阿里巴巴同步工具DataX实现Mysql与ElasticSearch(ES)数据同步

一、Linux环境要求 二、准备工作 2.1 Linux安装jdk 2.2 linux安装python 2.3 下载DataX&#xff1a; 三、DataX压缩包导入&#xff0c;解压缩 四、编写同步Job 五、执行Job 六、定时更新 6.1 创建定时任务 6.2 提交定时任务 6.3 查看定时任务 七、增量更新思路 一、Linux环境要…

el-table操作栏按钮过多 增加展开/收起功能

是的 如图所示有那么一条数据 列表操作栏的按钮七八个 小屏笔记本啥数据项也别看了 就剩下个固定列大刺刺的占着整个页面 解决方法&#xff1a; <el-table-column :width"tableToggle ? 600 : 300" label"操作栏" align"center" header-ali…

类和对象,this指针

一、类的引入&#xff1a; 如下&#xff0c;在C中&#xff0c;我们可以在结构体中定义函数&#xff0c;如下&#xff0c;之前我们学习C中中一直是在结构体中定义变量。 struct student{void studentinfo(const char* name,const char* gener,int age){ strcpy(_name,name);st…

前端css面试题(四)

文章目录 对一些 CSS 默认值的考察css选择器说一下z-indexz-index的值大的dom一定能覆盖z-index值小的dom吗如果一个第三方组件的z-index与我们现有业务的页面有冲突&#xff0c;怎么处理关于浮动元素样式引入权重问题链接引入&#xff08;Link&#xff09;和 import注入的区别…

理解输出电压纹波和噪声:来源与抑制

医疗设备、测试测量仪器等很多应用对电源的纹波和噪声极其敏感。理解输出电压纹波和噪声的产生机制以及测量技术是优化改进电路性能的基础。 1&#xff1a;输出电压纹波 以Buck电路为例&#xff0c;由于寄生参数的影响&#xff0c;实际Buck电路的输出电压并非是稳定干净的直流…

【wvp】测试记录

ffmpeg 这是个莫名其妙的报错&#xff0c;通过排查&#xff0c;应该是zlm哪个进程引起的 会议室的性能 网络IO也就20M

【分布式微服务专题】从单体到分布式(二、SpringCloud整合Nacos)

目录 前言阅读对象阅读导航前置知识笔记正文一、下载安装二、项目整合2.1 服务注册与发现2.2 动态配置管理 三、其他实验四、服务之间的调用 学习总结感谢 前言 本篇笔记主要是记录我整合Nacos项目进来的过程。以实现服务注册发现&#xff0c;以及分布式配置管理。关于Nacos&a…

Leetcode刷题笔记题解(C++):LCR 121. 寻找目标值 - 二维数组

思路&#xff1a;从左小角或者右上角开始遍历&#xff0c;假设右上角开始遍历&#xff0c;如果当前值大于目标值则列-1&#xff1b;如果当前值小于目标值则行1&#xff0c;以此遍历来查找目标值&#xff1b;注意col和row的选取 class Solution { public:bool findTargetIn2DPl…

测试文档---消息驿站

文章目录 项目背景测试计划服务器模块设计测试用例进行单元测试/黑盒测试 客户端模块设计测试用例进行单元测试/黑盒测试 转发规则模块设计测试用例进行单元测试/黑盒测试 测试总结 项目背景 在高并发量的情况下&#xff0c;针对某一台服务器的访问量激增就可能导致该服务器“…

关于最长上升子序列的动态规划问题的优化算法(二分搜索)

最长递增子序列 暴力解法&#xff1a; 思路&#xff1a;使用动态规划的思想&#xff0c;判断当前元素之前的所有元素&#xff0c;如果比当前元素小&#xff0c;则修改当前元素的最长递增子序列&#xff08;需判断是否需要修改&#xff09;。 时间复杂度&#xff1a;O(n^2) im…

leetcode做题笔记1466. 重新规划路线

n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。因此&#xff0c;要想在两座不同城市之间旅行只有唯一一条路线可供选择&#xff08;路线网形成一颗树&#xff09;。去年&#xff0c;交通运输部决定重新规划路线&#xff0c;以改变交通拥堵的状况。 路…

C#winform根据选择的Excel文件在数据库中创建数据表

C#winform根据选择的Excel文件在数据库中创建数据表 需求&#xff1a;根据选择的Excel文件在数据库中创建数据表&#xff1b;可以实现特殊字段&#xff08;比如字段中含有数字、下划线、特殊字符等&#xff09;以及表名创建 C#实现 using System; using System.Data; using S…

运维05:自动化

人工运维时代 运维人员早期需要维护众多的机器&#xff0c;因此需要执行很多重复的劳动&#xff0c;很多机器需要同时部署相同的服务或者是执行相同的命令&#xff0c;还得反复地登录不同的机器&#xff0c;执行重复的动作 自动化运维时代 早期运维人员会结合ssh免密登录&…

Shell数组函数:数组——数组和循环(二)

for脚本快速定义数组 [rootlocalhost ~]# vim for12.sh #脚本编辑 #!/bin/bash for a in cat /etc/hosts do hosts[o]$a donefor i in ${!hosts[]} do echo "$i : ${hosts[$a]}" done[rootlocalhost ~]# vim for12.sh #执行脚本区别 &#xff1a;for的空格分割…

漏洞复现-某教育视频云平台前台某接口文件上传漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

【每日一题】—— D. Divide and Equalize(Codeforces Round 903 (Div. 3))(数学、数论)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

代码随想录二刷 | 栈与队列 | 前 k 个高频元素

代码随想录二刷 &#xff5c; 栈与队列 &#xff5c; 前 k 个高频元素 题目描述解题思路 & 代码实现 题目描述 347.前k个高频元素 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nu…

[node] Node.js的Web 模块

[node] Node.js的Web 模块 什么是 Web 服务器&#xff1f;Web的应用架构http使用方式使用 Node 创建 Web 服务器使用 Node 创建 Web 客户端 什么是 Web 服务器&#xff1f; Web服务器一般指网站服务器&#xff0c;是指驻留于因特网上某种类型计算机的程序&#xff0c;Web服务器…

http与apache

目录 1.http相关概念 2.http请求的完整过程 3.访问浏览器背后的原理过程 4.动态页面与静态页面区别 静态页面&#xff1a; 动态页面&#xff1a; 5.http协议版本 6.http请求方法 7.HTTP协议报文格式 8.http响应状态码 1xx&#xff1a;提示信息 2xx&#xff1a;成功…