C 深入指针(1)

news2024/11/25 9:55:53

目录

一、const

1、const修饰变量

2、const修饰指针

2.1 const int* p(int const* p)

2.2 int* const p

2.3 结论

二、指针运算

1、指针 +- 整数

2、指针 - 指针

3、指针的关系运算

三、指针的使用

1、模拟实现 strlen

2、传值调用和传址调用


一、const

1、const修饰变量

通过上图的报错信息可知,被const修饰的变量无法别修改,那我们试试通过地址修改他

#include<stdio.h>
int main()
{
	const int n = 10;
	int* p = &n;    
	*p = 20;
	printf("%d", n);    //成功输出20!
	return 0;
}

还真可以,这让我想到那些红客哈哈好厉害。

在这里我们明明不想n被改变,结果通过指针给n改了,这是不合理的!那该怎么办呢?


2、const修饰指针

2.1 const int* p(int const* p)

在 * 左边加上const可以看到,*p 无法被修改了

int const* p = &n;    //和 const int* p 等价

2.2 int* const p

那指针内的地址能修改吗

可以看到地址能被修改,指针变量 p 存放的本来是 n 的地址,输出应该是10,结果输出100;说明 p 存放的地址被改成了 m 的地址;地址不想被修改怎么办?

在 * 右边加上const可以看到,p 无法被修改了


2.3 结论

const 如果放在 * 的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。 但是指针变量本身的内容可变。

const 如果放在 * 的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指 向的内容,可以通过指针改变。  

如果都不想被修改,左右都加上const就好啦

const int* const p = &n;

int const* const p = &n


二、指针运算

指针的基本运算有三种,分别是:

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

1、指针 +- 整数

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;
	//依次打印数组内容
	for (int i = 0; i < 10; i++)
	{
		//printf("%d ", arr[i]);
		printf("%d ", *(p + i));	//指针+整数	
	}
	return 0;
}

2、指针 - 指针

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p1 = arr;		//指向数组第一个元素
	int* p2 = arr + 9;	//指向数组最后一个元素
	//输出的是字符串的长度,9
	printf("%zd", p2 - p1);
	return 0;
}

3、指针的关系运算

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p1 = arr;		//指向数组第一个元素
	int* p2 = arr + 9;	//指向数组最后一个元素
	//依次打印数组元素
	while (p1 <= p2)    //关系运算
	{
		printf("%d ", *p1);
		p1++;
	}
	return 0;
}

三、指针的使用

1、模拟实现 strlen

库函数strlen的功能是求字符串长度,统计的是字符串中 \0 之前的字符的个数。

#include<stdio.h>
#include<string.h>	//使用strlen时必须声明的头文件
int main()
{
	char arr[] = "abcd";
	size_t length = strlen(arr);
	printf("%zd", length);	//输出 4
	return 0;
}

通过使用指针来模拟实现 strlen函数:

#include<stdio.h>
int my_strlen(const char* p)
{
	int count = 0;
	while (*p)	//遍历到末尾的 \0 就会终止循环
	{
		count++;
		p++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	int length = my_strlen(arr);	//模拟strlen
	printf("%d", length);
	return 0;
}

2、传值调用和传址调用

我们通过写一个交换值的函数来告诉这两者的区别

#include<stdio.h>
//传值调用
void swap(int x, int y)	//x = a; y = b
{
	int tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 1;
	int b = 100;
	printf("交换前:a = %d b = %d\n", a, b);
	swap(a, b);	//想实现交换两个变量的值
	printf("交换后:a = %d b = %d", a, b);
	return 0;
}

运行之后发现 a 和 b 的值根本没有改变,这是为什么,启动调试监测

不清楚为什么是栈区可以看初阶 C语言的变量和算术操作符-CSDN博客

结论:实参传递给形参的时候,形参会单独创建一份临时空间来接收实参,对形参的修改不影响实 参。 所以 swap() 失败了。 

所以我们需要传址调用

#include<stdio.h>
//传址调用
void swap(int* x, int* y)	//x = &a; y = &b
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}
int main()
{
	int a = 1;
	int b = 100;
	printf("交换前:a = %d b = %d\n", a, b);
	swap(&a, &b);	//实现交换两个变量的值
	printf("交换后:a = %d b = %d", a, b);
	return 0;
}

这次就成功交换了,这里调用 swap函数 的时候是将变量的地址传递给了函数,这种函数调用方式叫:传址调用

传址调用,可以让函数和主调函数之间建立真正的联系,在函数内部可以修改 main函数 中的变量;所以未来函数中只是需要 main函数 中的变量值来实现计算,就可以采用传值调用。如果函数内部要修改 main函数 中的变量的值,就需要传址调用。


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

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

相关文章

读天才与算法:人脑与AI的数学思维笔记16_音乐图灵测试

1. 艾米 1.1. 人工智能作曲家 1.1.1. 分析机可能会生成任意复杂程度、精细程度的科学的音乐作品 1.1.1.1. 阿达洛夫莱斯 1.1.2. 巴赫的作品是大多数作曲家开始学习创作的起点&#xff0c;也是大多数计算机开始学习作曲的起点…

汽车车灯罩通常使用的主要材料包括什么?汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

1.聚碳酸酯&#xff08;PC&#xff09;&#xff1a;PC具有高强度、高韧性和耐冲击性&#xff0c;因此常用于汽车车灯的外罩和透镜部分。它还具有良好的透光性&#xff0c;使得车灯能够有效地发光。 2.丙烯酸酯&#xff08;PMMA&#xff09;&#xff1a;PMMA&#xff0c;也称为…

基于GWO灰狼优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 长短时记忆网络&#xff08;LSTM&#xff09;处理序列依赖关系 4.3 注意力机制&#xff08;Attention&#xff09; 4…

SpringBoot实现图片上传(个人头像的修改)

SpringBootlayui实现个人信息头像的更改 该文章适合对SpringBoot&#xff0c;Thymeleaf&#xff0c;layui入门的小伙伴 废话不多说&#xff0c;直接上干货 Springbootlayui实现头像更换 前端公共部分代码 HTML页面代码 <div class"layui-card-header" style&quo…

[实例] Unity Shader 利用顶点着色器模拟简单水波

我们都知道顶点着色器可以用来改变模型各个顶点的位置&#xff0c;那么本篇我们就利用顶点着色器来做一个模拟简单水波的应用。 1. 简谐运动 在进行模拟水波之前&#xff0c;我们需要了解简谐运动&#xff08;Simple Harmonic Motion&#xff09;公式&#xff1a; 其中&#…

有公网IP的好处?

1. 维护远程连接需求的解决方案 公网IP是指可以通过互联网直接访问的IP地址&#xff0c;相对于私有IP地址而言具有重要的好处。公网IP的最大好处之一是解决了各行业客户的远程连接需求。由于天联组网操作简单、跨平台应用、无网络要求以及独创的安全加速方案等原因&#xff0c…

Python 全栈体系【四阶】(三十八)

第五章 深度学习 八、目标检测 3. 目标检测模型 3.2 YOLO 系列 3.2.1 YOLOv1&#xff08;2016&#xff09; 3.2.1.1 基本思想 YOLO&#xff08;You Only Look Once &#xff09;是继 RCNN&#xff0c;fast-RCNN 和 faster-RCNN 之后&#xff0c;Ross Girshick 针对 DL 目…

人工智能论文:BERT和GPT, GPT-2, GPT-3 的简明对比和主要区别

在BERT的论文里面&#xff1a; 2018.10 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding&#xff0c;BERT已经解释了BERT&#xff0c;GPT&#xff0c;ELMo的区别。 *ELMo为双向RNN&#xff0c;请忽略。 主要区别&#xff1a; BERT使用的是…

Qt QLCDNumber详解

1.简介 它提供了一个显示数字的显示屏控件&#xff0c;效果类似于现实世界中的液晶显示屏。它可以显示任何大小的数字。它可以显示十进制、十六进制、八进制或二进制数字。可以用setMode更改基数&#xff0c;用setSmallDecimalPoint更改小数点。 2.常用方法 以下是一些常用的…

nginx--第三方模块安装上传下载服务

第三方模块安装 准备 cd /usr/local/src/ yum install git -y git clone https://github.com/openresty/echo-nginx-module.git cd nginx-1.24.0 yum -y install perl-devel perl-ExtUtils-Embed zlib-devel gcc-c libtool openssl openssl-devel 编译安装 ./configure \--p…

【深度学习基础(2)】深度学习之前:机器学习简史

文章目录 一. 深度学习的起源1. 概率建模--机器学习分类器2. 早期神经网络--反向传播算法的转折3. 核方法 -- 忽略神经网络4. 决策树、随机森林和梯度提升机5. 神经网络替代svm与决策树 二. 深度学习与机器学习有何不同 可以这样说&#xff0c;当前工业界所使用的大部分机器学习…

Web安全研究(七)

NDSS 2023 开源地址&#xff1a;https://github.com/bfpmeasurementgithub/browser-fingeprint-measurement 霍普金斯大学 文章结构 introbackground threat model measurement methodology step1: traffic analysisstep2: fingerprint analysis dataset attack statisticsbro…

【通信中间件】Fdbus HelloWorld实例

Fdbus实例教程 Fdbus简介 Fdbus 全称 Fast Distributed Bus&#xff08;高速分布式总线&#xff09;&#xff0c;提供IPCRPC功能。适用于多种OS&#xff1a; LinuxQNXAnroidOSWindow Fdbus本质是Socket&#xff0c;IPC基于Unix domain socket&#xff0c;RPC基于TCP。使用G…

诺基亚贝尔探访上海斯歌,共探创新合作新机遇

近日&#xff0c;上海斯歌K2 BPM迎来重要客户考察交流活动。来自诺基亚贝尔的首席数字官刘少勇一行莅临了上海斯歌K2 BPM 的武汉研发中心&#xff0c;并对上海斯歌在BPM业务流程管理领域的研发成果及交付能力给予了高度肯定。 此次活动不仅加深了双方的战略合作&#xff0c;也为…

【机器学习基础1】什么是机器学习、预测模型解决问题的步骤、机器学习的Python生态圈

文章目录 一. 什么是机器学习1. 概念2. 机器学习算法分类 二. 利用预测模型解决问题的步骤三. 机器学习的Python生态圈 一. 什么是机器学习 1. 概念 机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;是一门多领域的交叉学科&#xff0c;涉及概率论、统计学、…

Librosa:探索音频处理利器

Librosa&#xff1a;探索音频处理利器 音频处理在数据科学、音乐分析和语音识别等领域中扮演着重要角色。Python库Librosa是一个功能强大且广泛使用的工具&#xff0c;专门用于音频分析和处理。本文将介绍Librosa库的基本概念、主要功能以及常见应用场景&#xff0c;帮助读者深…

银行卡归属地查询API接口快速对接

银行卡归属地查询API接口指的是通过银行卡号查询该银行卡详细信息&#xff0c;包括银行卡名称、卡种、卡品牌、发卡行、编号以及归属地等信息&#xff0c;支持一千多家银行返回归属地信息&#xff0c;那么银行卡归属地查询API接口如何快速对接呢&#xff1f; 首先找到有做银行…

【linux-汇编-点灯之思路-程序】

目录 1. ARM汇编中的一些注意事项2. IMXULL汇编点灯的前序&#xff1a;3. IMXULL汇编点灯之确定引脚&#xff1a;4. IMXULL汇编点灯之引脚功能编写&#xff1a;4.1 第一步&#xff0c;开时钟4.2 第二步&#xff0c;定功能&#xff08;MUX&#xff09;4.3 第三步&#xff0c;定电…

Qt5 框架学习及应用 — 对象树

Qt 对象树 对象树概念Qt为什么使用对象树 &#xff1f;将对象挂到对象树上 对象树概念 对象树&#xff1a;对于树的概念&#xff0c;相信许多学过数据结构的同学应该都不会陌生。在学习数据结构的时候我们所接触的什么二叉树、多叉树、哈夫曼树、AVL树、再到红黑树、B/B树………

【C++中的模板】

和你有关&#xff0c;观后无感................................................................................................................. 目录 前言 一、【模板的引入和介绍】 1、泛型编程 2、【模板的介绍】 二、【 函数模板】 2.1【模函数板的介绍】 1.…