[C语言]指针和数组

news2024/11/26 5:39:17

目录

1.数组的地址

 2.通过指针访问数组

3.数组和指针的不同点

 4.指针数组


1.数组的地址

数组的地址是什么?

看下面一组代码

#include <stdio.h>
int main()
{
int arr[5] = {5,4,3,2,1};
printf("&arr[0] = %p\n", &arr[0]);
printf("arr     = %p\n", arr);
return 0;
}

 运行结果:

从上面代码中可以看到数组名和首元素的地址和是一样的

但是有不同的情况

举例:

#include <stdio.h>
int main()
{
	int arr[6] = { 5,4,3,2,1,0 };
	printf("&arr[0]   = %p\n", &arr[0]);
	printf("&arr[0]+1 = %p\n\n", &arr[0]+1);

	printf("arr       = %p\n", arr);
	printf("arr+1     = %p\n\n", arr+1);

	printf("&arr      = %p\n", &arr);
	printf("&arr+1    = %p\n\n", &arr+1);

	return 0;
}

运行结果

可以看到当对&arr[0],arr,&arr都+1时,&arr[0]和arr都移动了4个字节,而&arr移动了16个字节也就是整个数组的长度。

实际上除了&数组名表示整个数组的地址,在使用sizeof(数组名)计算数组的字节数时时,sizeof中的数组名表示的也是整个数组的地址。

总结:数组名表示的是数组首元素的地址,但有两个例外:

1.&数组名

这里的数组名实际上表示的是整个数组的地址

2.sizeof(数组名)

这里的数组名也表示整个数组的地址,计算的是整个数组的字节数。

 2.通过指针访问数组

#include <stdio.h>
int main()
{
	int arr[5] = { 0,1,2,3,4, };
	int i = 0;
	int n = 100;
	int* p = arr;
	for (i; i < 5; i++)//通过指针p给数组重新赋值
	{
		*p = n;
		n++;
		p ++;
	}
	for (i = 0; i < 5; i++)//打印数组每个元素
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

运行结果:

可以看到数组的值可以通过指针被改变

把代码稍作修改:

#include <stdio.h>
int main()
{
	int arr[5] = { 0,1,2,3,4, };
	int i = 0;
	int n = 100;
	int* p = arr;
	for (i; i < 5; i++)//通过指针p给数组重新赋值
	{
		*p = n;
		n++;
		p++;
	}
	for (i = 0; i < 5; i++)//打印地址
	{
		printf("&arr[i] =%d\np+i     =%d\n", &arr[i],p+i);
	}
	return 0;
}

运行结果: 

 

 可以看到arr[i]的地址就是指针变量p+1的地址,这也是通过指针更改变数组的每一个元素的原因

3.数组和指针的不同点

int arr[10];
int * p = arr:
p = arr;
//ok

 当给p进行赋值时程序会正常执行

int arr[10];
int brr[10];
arr = brr;
//err

 当给函数名赋值时程序会报错

总结:赋值表达式的左操作数不能是数组名,但可以是指针变量。

 4.指针数组

指针数组就是存放指针的数组

例如:

#include <stdio.h>
int main()
{
	int a = 0;
	int* p = &a;
	int* pp = &a;
	int* ppp = &a;
	int arr[3] = { *p,*pp,*pp };
	printf("%d %d %d\n", arr[0], arr[1], arr[2]);
	return 0;
}

运行结果:

 

通过上面的代码可以看到通过指针数组的元素,也能访问到指针指向的变量。

 注意:指针数组是数组,而数组指针是指针

指针数组是存放指针的数组,数组指针是指向数组的指针。

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

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

相关文章

最新版IntelliJ IDEA 2024.2.3 创建SpringBoot项目(包含各种依赖的选择和功能)

创建SpringBoot项目 1 . 打开IDEA 选择新建项目 2. 基础项目创建 在顶端几个选项可以选择创建基本的java项目 填写项目名称,文件位置,选择构建工具 3. 下方选择springboot 选择构建的方式 三种方式虽然不同但是,基本功能都一致, Gradle-Groovy 是指使用 Groovy 语言编写…

鸿蒙开发(NEXT/API 12)【访问控制应用权限管控概述】程序访问控制

默认情况下&#xff0c;应用只能访问有限的系统资源。但某些情况下&#xff0c;应用存在扩展功能的诉求&#xff0c;需要访问额外的系统数据&#xff08;包括用户个人数据&#xff09;和功能&#xff0c;系统也必须以明确的方式对外提供接口来共享其数据或功能。 系统通过访问…

http2详细讲解

github链接 &#xff1a; http2

免费音频剪辑软件大揭秘:让声音创作更轻松

在精神娱乐越发丰富的现在&#xff0c;音频内容的创作和编辑变得越来越重要。无论是专业的音乐制作人&#xff0c;还是自媒体创作者&#xff0c;都可能需要一款功能强大且易于使用的音频剪辑软件来处理音频素材。今天我们一同来探讨有什么好用的免费音频剪辑软件吧。 1.福昕音…

UGUI(六大UI根基组件)

Rect Transform 各种参数 是显示pos还是width/height 还是left/top/right/bottom之类巴拉巴拉&#xff0c;各种混合的展示baby&#xff0c;都是看anchor的设置 pivot的设置影响具体数值 至于blueprint mode &#xff0c;就是用了之后框框不变&#xff0c;who wanna do thi…

Graph Retrieval-Augmented Generation: A Survey

最近&#xff0c;检索增强生成(RAG)在解决大型语言模型(llm)的挑战方面取得了显著的成功&#xff0c;而无需再培训。通过引用外部知识库&#xff0c;RAG改进了LLM输出&#xff0c;有效地减轻了诸如“幻觉”、缺乏特定于领域的知识和过时信息等问题。然而&#xff0c;数据库中不…

数据结构与算法篇(图)(持续更新迭代)

目录 一、引言 二、基本概念 三、图的定义 四、图的基本概念和术语 1. 有向图 2. 无向图 3. 简单图 4. 多重图 5. 完全图&#xff08;也称简单完全图&#xff09; 6. 子图 7. 连通、连通图和连通分量 8. 强连通图、强连通分量 9. 生成树、生成森林 10. 顶点的度、…

通信工程学习:什么是OSPF开放式最短路径优先

OSPF&#xff1a;开放式最短路径优先 OSPF&#xff08;Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09;是一种内部网关协议&#xff08;IGP&#xff09;&#xff0c;被广泛应用于计算机网络中&#xff0c;特别是在构建大型和复杂的网络时。以下是对OSPF的…

【Linux】进程第三弹(虚拟地址空间)

目录 现象 底层原因 数据不发生修改 数据修改 小总结 地址空间本质 为什么要有地址空间 现象 来看代码&#xff1a; #include <stdio.h> #include <unistd.h> #include <sys/types.h>int val 50;int main() {printf("father process is running…

Kotlin真·全平台——Kotlin Compose Multiplatform Mobile(kotlin跨平台方案、KMP、KMM)

前言 随着kotlin代码跨平台方案的推出&#xff0c;kotlin跨平台一度引起不少波澜。但波澜终归没有掀起太大的风浪&#xff0c;作为一个敏捷型开发的公司&#xff0c;依然少不了Android和iOS的同步开发&#xff0c;实际成本和效益并没有太多变化。所以对于大多数公司来说依然风平…

【数据结构】【链表代码】移除链表元素

移除链表元素 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val) { // 创建一个虚拟头节点&#xff0c;以处理头节点可能被删除的情况 struct…

ROS/Gazebo/Nav2/MoveIt Pro/RMF学习笔记24-10-06

ROS ROS&#xff08;Robot Operating System&#xff09;系统&#xff0c;尽管严格意义上来说并非一个操作系统&#xff0c;而是一个专为机器人软件开发的开源软件框架集合&#xff0c;它在机器人技术领域中扮演着至关重要的角色。ROS系统的新应用和特性主要体现在以下几个方面…

【Linux】Shell脚本基础+条件判断与循环控制

目录 一、介绍 1. Linux提供的Shell解析器 2. bash和sh关系 3. Centos默认的Shell解析器是bash 二、定义 1. 变量名的定义规则 2. 等号周围没有空格 3. 查看变量 4. 删除变量 5. 正确地定义数组 6. 将局部环境变量提升为全局 7. 正确选择引号 8. 特殊变量名 三…

MES系统与其他系统的集成

一、MES与ERP的集成 1. 实时数据共享 万界星空科技MES系统可以与企业资源计划&#xff08;ERP&#xff09;系统集成&#xff0c;实现双向数据传输。通过实时数据共享&#xff0c;ERP系统能够更准确地进行物料需求计划&#xff0c;并及时更新生产进度和库存信息。 2. 工单管理…

LeetCode讲解篇之322. 零钱兑换

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们可以使用动态规划解决这道题&#xff0c;我们首先定义一个数组&#xff0c;数组中第i个元素表示组成金额 i 的最少硬币个数 我们遍历数组的1 ~ amount号位置&#xff0c;对coins进行遍历&#xff0c;查找选…

短剧小程序短剧APP在线追剧APP网剧推广分销微短剧小剧场小程序集师知识付费集师短剧小程序集师小剧场小程序集师在线追剧小程序源码

一、产品简介功能介绍 集师专属搭建您的独有短剧/追剧/小剧场小程序或APP平台 二、短剧软件私域运营解决方案 针对短剧类小程序的运营&#xff0c;以下提出10条具体的方案&#xff1a; 明确定位与目标用户&#xff1a; 对短剧类小程序进行明确定位&#xff0c;了解目标用户群体…

【最新华为OD机试E卷-支持在线评测】计算三叉搜索树的高度(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

社会工程学:社工无处不在

目录 社会工程学 社工利用了人的弱点 社会工程学攻击的流程通常可以分为以下几个步骤 以下是一些常见的方式&#xff0c;攻击者可以利用这些方式来收集个人信息 一些常见的攻击方式 钓鱼邮件 宏病毒 网站克隆 防范 社会工程学 介绍&#xff1a; 社会工程学是一种攻击技…

S7-200 SMART 与调试助手之间 Modbus RTU 通信

西门子在 STEP 7-Micro/WIN SMART 中正式推出 Modbus RTU 主站/从站协议库&#xff0c;Modbus RTU 指令位于 STEP7-Micro/WIN SMART 项目树中“指令”文件夹的“库”文件夹中。如图1.Modbus RTU库指令所示。 图1.Modbus RTU库指令 注意&#xff1a; 1. Modbus RTU 主站指令库的…

nginx 负载均衡1

遇到的问题 大型网站都要面对庞大的用户量&#xff0c;高并发&#xff0c;海量数据等挑战。为了提升系统整体的性能&#xff0c;可以采用垂直扩展和水平扩展两种方式。 垂直扩展&#xff1a;在网站发展早期&#xff0c;可以从单机的角度通过增加硬件处理能力&#xff0c;比如 C…