C语言指针(2)

news2024/10/2 14:30:04

今天我们接着前两天的内容继续讲解

一、数组名的理解

1、&arr[0]与arr

有时候我们需要获取数组首元素,有两种方法可以获取。

使用这两种方法都可以获得数组首元素&arr[0],arr。

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

输出:

输出的内容就是首元素的地址。

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

输出:

对于这一题同学们就疑惑了,不是arr可以获得数组首元素地址吗,怎么在这段代码中就不是了。

有两种情况:

1、sizeof(数组名)单独存在sizeof中的数组名是用来求数组大小的。

2、&数组名,这是用来获取整个数组地址的。

2、&arr与arr

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

输出:

我们发现获取整个数组地址跟获取数组首元素地址打印出来的地址是一样的,那到底他们有什么不一样呢,如果我们把这两个都+1会是什么效果。

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

输出:

数组之间元素的间距是一个int类型,一个int类型等于4个字节。

我们看见,&arr+ 1,跳过了整个数组,就是40个字节。

而arr+1跳过了一个int类型,那就是3个字节。

二、使⽤指针访问数组

void add(int* p, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
}

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	add(arr, sz);
	return 0;
}

输出:

在以前的时候,我们在接收函数传过去实参的时候,都是使用形参来接收。

void add(int* p, int sz),大家可以看见,我们使用指针同样是可以接收传过去的数组的,p指针接收的是arr数组中首元素的地址。通过循环语句从首元素打印,一直打印完数组全部。

printf("%d ", *(p + i));这一行代码,*(p+i)等于p[i],这两种写法都可以,在编译器编译的时候,是通过指针实现的。

*(p + i),
*(p+0)=1
*(p+1)=2
*(p+2)=3
……
*(p+9)=10

那么同样通过指针输入数值到数组里吗?

当然也是可以的:

void add(int* p, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
}

int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = arr;
	for (int i = 0; i < sz; i++)
	{
		scanf("%d", p+i); //arr+i也可以
	}
	add(arr, sz);
	return 0;
}

三、一维数组的传参本质

void add(int arr[ ])
{
	int sz2 = sizeof(arr) / sizeof(arr[0]);
	printf("sz2=%d\n", sz2);
}

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

输出:

sz1与sz2为什么得到的结果不一样呢。

因为在函数add中,传过去的是arr[ ] 这并不是整个数组的地址,而不是数组首元素的地址。

void add(int* arr) //int* arr = int arr[0]
{
	int sz3 = sizeof(arr) / sizeof(arr[0]);
	printf("sz3=%d\n", sz3);
}

我们也可以通过指针传参把首元素给传过去。

总结:一维数组传参可以使用指针来传,也可以通过数组形式来传参

四、⼆级指针

二级指针指向的是一级指针。

int main()
{
	int a = 10;
	int* pa = &a;
	int** paa = &pa;
	return 0;
}

**paa = 30;

printf("%d\n", a);//输出30;

**paa可以直接修改a变量的,因为**paa中存放的是*pa,而*p存放的是a的地址。

五、指针数组

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

六、指针数组模拟⼆维数组

int main()

{

       int arr1[5] = {1,2,3,4,5};

       int arr2[5] = {2,3,4,5,6};

       int arr3[5] = {3,4,5,6,7};

       int* arr[3] = { arr1,arr2,arr3 };

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

       {

              for (int j = 0; j < 5; j++)

              {

                     printf("%d ", arr[i][j]);

              }

              printf("\n");

       }

       return 0;

}

可以看见,我们通过使用一维数组实现了二维数组,代码中最重要的一点就是指针数组,指针数组把一维数组中首元素地址给放到了一个数组中,我们通过循环遍历就可以打印出每个一维数组中的值。

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

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

相关文章

Ubuntu安装nvidia-docker并使用的正确方式

Ubuntu安装docker: ubuntu(24.04)以及WSL2安装docker的详细教程_unbantu安装docker-CSDN博客文章浏览阅读646次,点赞5次,收藏3次。默认情况下,只有root用户和docker组的用户才能运行Docker命令。我们可以将当前用户添加到docker组,以避免每次使用Docker时都需要使用sudo。…

Undefined symbol vApplicationGetTimerTaskMemory (referred from timers.o).

在使用FreeRTOS中的cubemx配置RTC时钟时&#xff0c;配置完毕出现这个问题&#xff0c; Error: L6218E: Undefined symbol vApplicationGetTimerTaskMemory (referred from timers.o). 链接器在timers.o目标文件中发现了一个未定义的符号vApplicationGetTimerTaskMemory。这个…

深度学习复盘与论文复现F

文章目录 1、Environment construction1.1 macos conda1.2 macos PyTorch1.3 iTerm settings1.4 install jupyter 2、beam search2.1 greedy search2.2 exhaustive search2.3 beam search 3、Attention score3.1 Masking softmax operation3.2 Additive attention3.3 Zoom dot …

《Milvus Cloud向量数据库指南》——Zilliz Cloud 高可用性深度解析:赋能GenAI应用,引领非结构化数据新纪元

在人工智能与大数据技术日新月异的今天,非结构化数据的处理与分析已成为推动行业智能化转型的关键驱动力。Zilliz Cloud,作为基于开源向量数据库Milvus构建的全托管解决方案,不仅革新了非结构化数据的存储与查询方式,更以其卓越的高可用性设计,为开发人员构建高效、可靠的…

国内的自闭症康复学校:星贝育园的独特干预法

在国内自闭症康复的广袤领域中&#xff0c;星贝育园宛如一颗璀璨的明星&#xff0c;凭借其创新而卓越的教育理念以及独树一帜的干预方法&#xff0c;为特殊儿童及其家庭点亮了希望之光&#xff0c;带来了深刻而积极的转变。 星贝育园团队精心打造的 CBM 干预法&#xff0c;无疑…

计算机毕业设计选题推荐-校园消费点评系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

最好用的深拷贝方法?分享 1 段优质 JS 代码片段!

本内容首发于工粽号&#xff1a;程序员大澈&#xff0c;每日分享一段优质代码片段&#xff0c;欢迎关注和投稿&#xff01; 大家好&#xff0c;我是大澈&#xff01; 本文约 900 字&#xff0c;整篇阅读约需 1 分钟。 今天分享一段优质 JS 代码片段&#xff0c;轻松实现了对象…

【JVM基础10】——垃圾回收-JVM垃圾回收算法有哪些?

目录 1- 引言&#xff1a;垃圾回收算法2- ⭐核心&#xff1a;三种垃圾回收算法2-1 标记清除法优缺点 2-2 标记整理算法优缺点 2-3 复制算法优缺点 3- 小结3-1 JVM 常见的垃圾回收算法有哪些&#xff1f; 1- 引言&#xff1a;垃圾回收算法 JVM 在识别了对象什么时候可以被回收之…

【精选】通信与感知(ISAC)必读好文

微信公众号&#xff1a;EW Frontier 个人博客&#xff1a;106.54.201.174 QQ交流群&#xff1a;949444104 简介 通信与感知&#xff08;ISAC&#xff09;也被称为联合雷达通信 (JRC) / 联合通信和雷达传感 (JCAS) / 双功能雷达通信 (DFRC) 定义&#xff1a;将传感和通信系统集…

redis详细介绍

Redis是一个开源的、基于内存的高性能键值对数据库&#xff0c;属于NoSQL数据库的一种。它以高性能、丰富的数据结构、持久化特性、复制、集群以及发布/订阅等特性而闻名。以下是Redis的详细介绍&#xff1a; 一、基本介绍 名称&#xff1a;Redis&#xff0c;全称Remote Dicti…

<数据集>起重机识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2984张 标注数量(xml文件个数)&#xff1a;2984 标注数量(txt文件个数)&#xff1a;2984 标注类别数&#xff1a;1 标注类别名称&#xff1a;[cranes] 使用标注工具&#xff1a;labelImg 标注规则&#xff1a;对…

Adobe Acrobat不支持图片格式转换PDF文件

我在将图片格式&#xff08;PNG,JPEG&#xff09;转换为PDF的过程中遇到了如下问题&#xff1a; 单文件的解决办法——在软件外实现转换&#xff1a; 使用照片打开图片 选择打印 打印机选择Adobe PDF&#xff0c;执行打印 选择PDF文件的保存位置&#xff0c;过一会儿可以正…

反转链表(LeetCode)

题目 给你单链表的头节点&#xff0c;请你反转链表&#xff0c;并返回反转后的链表 解题 class ListNode:def __init__(self, value0, nextNone):self.value valueself.next nextdef reverse_linked_list_recursive(head: ListNode) -> ListNode:# 空链表或单节点链表if …

【Material-UI】Autocomplete组件的自定义功能(Customization)详解

文章目录 一、定制输入框二、全局自定义选项三、特定场景的自定义1. GitHub标签选择器2. 提示功能 四、总结 在现代Web开发中&#xff0c;UI组件的可定制性是提升用户体验和界面一致性的重要因素。Material-UI的Autocomplete组件提供了丰富的自定义选项&#xff0c;使得开发者可…

调试工具之GDB的基本使用

GDB基本使用 GDB是Linux下一款非常强大的调试软件&#xff0c;其实就是GNU Debugger的缩写。接下来我们学习一下他的基本使用。 例子函数&#xff0c;其中只有一个ds18b20的采集温度函数和一个主函数&#xff1a; #include <stdio.h> #include <errno.h> #includ…

一些硬件知识(十九)

立创的这个功能&#xff0c;绕等长线时候真的好用到o(╥﹏╥)o&#xff1a; 设计完成后一定要有一个最小工艺安全间距的DRC检查&#xff0c;不然的话又会出现嘉立创反馈短路&#xff0c;或者工艺生产不了&#xff1a; PMOS防反接电路&#xff1a; 理分析&#xff1a;当输入端加…

【两数之和 II - 输入有序数组】python刷题记录

R3-二分查找 双指针简单题 class Solution:def twoSum(self, numbers: List[int], target: int) -> List[int]:#双指针法i0jlen(numbers)-1while i<j:snumbers[i]numbers[j]if s>target:j-1elif s<target:i1else:return i1,j1return []

react-native从入门到实战系列教程一InputText组件之登录表单

登录使我们业务中不可缺少的功能&#xff0c;所以这篇我们学习写在react-native中实现表单登录 实现效果 代码实现 import {View,Text,StyleSheet,Dimensions,TextInput,Button,Alert, } from react-native; import {useEffect, useState} from react; import Logo from ../.…

通过systemd-resloved实现不同域名通过不同的`nameserver`进行解析

通过systemd-resloved实现不同域名通过不同的nameserver进行解析 一般来说只要DNS不发生网络故障就只会在一个nameserver 获取地址&#xff0c;但我们可能需要从不同nameserver 获取不同域名的地址&#xff0c;比如内网环境和外网环境分别使用不同的nameserver &#xff0c;但…

中间证书缺失如何发现和修复

一、背景 微信小程序等功能在发送后台请求时一般都会要求证书齐全&#xff0c;否则就会导致请求发送失败。 一般来说&#xff0c;如果中间证书不齐全&#xff0c;在不同设备上表现不一样&#xff0c;一般PC端可能不会有太大问题&#xff0c;仍然认为你的证书可信&#xff0c;但…