C语言基础:初识指针(二)

news2024/11/24 17:40:43

当你不知道指针变量初始化什么时,可以初始化为空指针

int *p=NULL;

我们看NULL的定义,可以看出NULL是0被强制转化为Void* 类型的0;实质还是个0; 

如何避免野指针:
1. 指针初始化
2. 小心指针越界
3. 指针指向空间释放即使置 NULL
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性

 指针运算

  • 指针+- 整数
  • 指针-指针
  • 指针的关系运算

 指针+- 整数

下面这段代码实现的是打印数组的元素。

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = arr;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *p);
		p = p + 1;
	}
	return 0;
}
指针 - 指针
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%d\n", & arr[9] - &arr[0]);
	return 0;
}

指针-指针得到的是中间元素的个数

例如:求字符串的长度。模拟实现strlen这个函数 

int my_strlen(char* str)
{
	char* start = str;
	char* end = str;
	while (*end != '\0')
	{
		end++;
	}
	return end - start;
}
int main()
{
	char arr[] = "bit";
	int len = my_strlen(arr);
	printf("%d\n", len);

	return 0;
}

 指针与数组

数组名是首元素地址,怎么证明呢?通过下面的代码进行证明

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
	printf("%p\n", arr);
	printf("%p\n", &arr[0]);
	return 0;
}

注意:两个例外

1.&arr   -   &数组名   -     数组名不是首元素地址-数组名表示整个数组 ,所以&数组名取出的是整个数组的地址,

2.sizeof(arr)  -  sizeof(数组名)-数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小。单位字节

下面的代码我们来看看他们的区别

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
	printf("%p\n", arr);
	printf("%p\n", arr+1);

	printf("%p\n", &arr[0]);
	printf("%p\n", &arr[0]+1);

	printf("%p\n", &arr);
	printf("%p\n", &arr + 1);
	return 0;
}

调试代码如下: 

前面两个都是地址加4,最后一个加了40,(16进制的运算) 

可以看出&arr是整个数组的地址,整个数组的地址加1,是跳过(整型)4*10(元素个数)=40

既然可以把数组名当成地址存放到一个指针中,我们使用指针来访问其中任意一个就成为可能。

看下面的代码:

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
	int* p = arr; //指针存放数组首元素的地址
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("&arr[%d] = %p   <====> p+%d = %p\n", i, &arr[i], i, p + i);
	}
	return 0;
}

 可以看出是是一一对应的关系,所以 p+i 其实计算的是数组 arr 下标为i的地址。 那我们就可以直接通过指针来访问数组。

打印数组元素

int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	int* p = arr; //指针存放数组首元素的地址
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
 	}
    for (i = 0; i < sz; i++)
	{
		printf("%d \n", arr[i]);
	}
	return 0;
}

二级指针

指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?

所以我们就有二级指针

a 的类型是int 

pa 的类型是int*

ppa  的类型是int**  最后一个*表示是指针,指向的对象是int*

int main()
{
	int a = 10;
	int* pa = &a;
	int** ppa = &pa;
	printf("%d\n", **ppa);
}

指针数组

与数组指针的区别       就像好孩子,重点是孩子,

指针数组-数组   --存放指针的数组。

数组指针-指针。

为啥要与指针数组,跟数组的由来一样,看下面的代码,对同一类型的地址存储,如果一个一个写下去,太麻烦了,所以我们要有指针数组来存放,这样就方便多了。

int main()
{
	int a = 10;
	int b = 20;
	int c = 30;
	int* pa = &a;
	int* pb = &b;
	int* pc = &c;
	return 0;
}

 

怎么初始化呢?

int arr[10];
int* arr1[3];//指针数组初始化

存放的类型都是int* 的类型

int* arr1[3] = { &a,&b,&c };
int main()
{
	int a = 10;
	int b = 20;
	int c = 30;
	int* arr2[3] = { &a,&b,&c };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		printf("%d \n", *(arr2[i]));
	}
	return 0;
}

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

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

相关文章

算法工程师——算法岗的分类及要求汇总

算法岗工程师 根据 Talent Seer 人才报告显示,全球 AI 从业者总人数约有 30 万,还是供不应求,其中 AI 技术专家(具有相关领域博士学位及 3 年以上工作经验的)约有 3.65 万。 简介 对于计算机专业的毕业生而言,算法岗基本上就是 「高薪」 的代名词。 在当今 IT 行业,算…

vue3.2+vite+unocss原子化配置

1、安装unocss&#xff1a;npm install unocss 2、vite.config.ts中配置&#xff1a; 3、创建unocss自己的ts文件&#xff1a;uno.config.ts 根路径下创建&#xff0c; 4、在创建好的uno.config.ts文件中编写如下代码&#xff1a; // uno.config.ts import {defineConfig,prese…

如果把软路由的网段更换成169.254.0.0/16会咋样?

前言 这几天有小伙伴在折腾软路由系统&#xff0c;然后问题就来了。 他咨询的是&#xff1a;为啥电脑连接软路由之后&#xff0c;无法访问软路由的管理页&#xff1f; 嗯。。。确实不是什么大事。但不注意看&#xff0c;还以为软路由没有正常获取到ip。 熟悉网络的小伙伴们都…

【统计推断】-01 抽样原理之(三)

文章目录 一、说明二、抽样分布三 均值抽样分布3.1 有限母体无放回抽样3.2 有限母体有放回抽样3.3 无限母体 四、比例抽样分布五、和差抽样分布 一、说明 上文中叙述母体和抽样的设计&#xff1b;以及抽样分布的概念&#xff0c;本篇将这种关系定量化&#xff0c;专门针对抽样的…

5V升8.4V2A同步升压恒压WT3213

5V升8.4V2A同步升压恒压WT3213 WT3213同步升压型直流/直流转换器以其微小的尺寸和卓越的能效而广受欢迎。这款设备在设计上的巧妙&#xff0c;包含电流模PWM控制环路、误差放大器、斜线补偿电路、比较器以及功率开关等关键元件&#xff0c;共同构成了它的特殊性能。 在细节上…

mysql-sql-练习题-1

文章目录 环境注释建表 5张建库学生表课程表教师表分数表总表 语法书写顺序in学过/没学过完全相同 环境 Windows cmd&#xff08;普通用户/管理员&#xff09; mysql -uroot -pmysql版本&#xff0c;模式&#xff08;可自定义&#xff09; select version(),global.sql_mode…

选对伪原创改写软件,文章写作不犯难!

文章写作在当下火热的自媒体的行业中是一项非常重要的技能&#xff0c;只要是参与做自媒体的朋友&#xff0c;想要在内容输出方面不出现困难的情况&#xff0c;那么文章写作的技能基本要具备&#xff0c;但是我们依然能看到有很多不擅长写作的朋友也做起了自媒体&#xff0c;并…

为什么选择福汇外汇?

福汇外汇凭借其品牌信誉、丰富的交易产品、先进的交易平台、高杠杆和低保证金要求、专业的客户服务、严格的监管以及便捷的出入金方式&#xff0c;成为了许多投资者选择的外汇交易平台。 为什么选择福汇外汇&#xff1f; 1、品牌信誉&#xff1a;福汇外汇是全球最大的零售外汇交…

深度学习-自动求导

目录 向量链式法则标量链式法则 拓展到向量例题1例题2 符号求导数值求导自动求导计算图自动求导的两种模式链式法则正向累积&#xff08;从x出发&#xff09;反向累积&#xff08;反向传递--先计算最终的函数即y&#xff09;反向累积总结 自动求导计算y关于x的梯度&#xff0c;…

Virtualbox7.0.10--创建虚拟机

前言 下载Virtualbox7.0.10&#xff0c;可参考《Virtualbox–下载指定版本》 Virtualbox7.0.10具体安装步骤&#xff0c;可参考《Virtualbox7.0.10的安装步骤》 Virtualbox7.0.10创建虚拟机&#xff0c;可参考《Virtualbox7.0.10–创建虚拟机》 Virtualbox7.0.10安装Ubuntu20.0…

校园安全升级:AR实景监测场景方案

在教育领域&#xff0c;随着校园的逐步对外开放&#xff0c;学校正面临着前所未有的管理挑战。社会人员的大量涌入不仅带来了文化的交流和知识的分享&#xff0c;也给校园安全带来了诸多隐患。新闻报道中不断出现的校园安全事件&#xff0c;如入室伤人、盗窃和非法传销等&#…

7.19 下午题典型考点

一、安全防护体系 &#xff08;一&#xff09;来由 安全保护等级&#xff08;5个&#xff09;&#xff1a;用户自主、系统审计、安全标记、结构化、访问验证&#xff08;自己全借问&#xff09; 为了对信息系统从不同角度做安全保护&#xff1b; 有利于从不同角度去加强信息系…

提示词工程入门-使用文心一言4.0-通义千问-GPT4-Claude3通用提示技巧测试

提示词工程基础&#x1f680; 在了解完了大语模型的基本知识&#xff0c;例如API的使用多轮对话&#xff0c;流式输出&#xff0c;微调&#xff0c;知识向量库等知识之后&#xff0c;接下来需要进一步补足的一个大块就是提示词工程&#xff0c;学习和了解提示词工程除了基本的提…

【逆向百例】百度翻译js逆向

关注它&#xff0c;不迷路。 本文章中所有内容仅供学习交流&#xff0c;不可用于任何商业用途和非法用途&#xff0c;否则后果自负&#xff01; 前言 目标 分析某度翻译接口&#xff0c;使用python获取翻译结果&#xff0c;并用pyinstaller打包成单文件可执行程序。 工具 ch…

云端飞翔,一触即达 —— 100G网卡,连接未来

关于100G网卡&#xff0c;这是一种高速网络接口控制器&#xff0c;主要用于数据中心和高性能计算环境&#xff0c;以支持更快的数据传输速率。100G网卡可以提供每秒100吉比特的传输速率&#xff0c;适用于需要处理大量数据和高速网络通信的场合。 在选择100G网卡时&#xff0c;…

排序算法(2)快排

交换排序 思想&#xff1a;所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0c;交换排序的特点是&#xff1a;将键值较大的记录向序列的尾部移动&#xff0c;键值较小的记录向序列的前部移动。 一、冒泡排序 public static…

【C++】stack queue的介绍使用以及模拟实现

目录 01.容器适配器 02.栈&#xff08;stack&#xff09; 1.stack的介绍 2.stack的使用 3.stack的模拟实现 03.队列&#xff08;queue&#xff09; 1.queue的介绍&#xff1a; 2.queue的使用 3.queue的模拟实现 04.双端队列&#xff08;deque&#xff09; 1.介绍 2.…

LeetCode1017题:负二进制转换(原创)

【题目描述】 给你一个整数 n &#xff0c;以二进制字符串的形式返回该整数的 负二进制&#xff08;base -2&#xff09;表示。注意&#xff0c;除非字符串就是 "0"&#xff0c;否则返回的字符串中不能含有前导零。 示例 1&#xff1a; 输入&#xff1a;n 2 输出&…

深度学习-N维数组和访问元素

目录 N维数组访问元素 N维数组 N维数组是机器学习和神经网络的主要数据结构 访问元素 最后一个子区域中的::是跳的意思&#xff0c;这个区域说明的是从第一个元素&#xff08;即第一行第一列那个&#xff09;对行开始跳3下循环下去直到行结束、对列开始跳2下循环下去直到列…

springboot拦载器

1、拦载器 package com.Interceptor;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.security.auth.login.Log…