首页 > 其他分享 >C语言中对数组进行解引用的几种常见写法

C语言中对数组进行解引用的几种常见写法

时间:2024-12-15 14:31:51浏览次数:7  
标签:sz arr int C语言 数组名 数组 写法 ptr 指针

1.对数组进行解引用

1.1使用数组名+索引(常用)

        该方法是最常见,也是最基本的,用数组名加下标来找到数组对应的元素

int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int ret = arr[2];
	printf("%d\n",ret);
	return 0;
}

        上面的代码中,数组的下标是0~4,通过arr[2],找到对应的元素应该就是3

1.2使用指针+索引(常用)

        这也是比较常见的写法,一般就是使用第一种或者这种,个人推荐

        数组名在C语言中实际上是一个指向数组首元素的指针常量,所以通过将数组名转化成指针来访问数组内部。

int main()
{
	int arr[] = { 1,2,3,4,5 ,6,7,8,9};
	int* ptr = arr;//指针ptr存放arr的首元素地址,也就是ptr指向arr首元素
    printf("%d",*(ptr+3));
	

        这里,*(ptr+2)是通过指针ptr+2来访问arr中索引为2的元素,ptr一开始指向arr首元素,+2即向后移动2个单位后所指向的元素,即被赋值为3 。

1.3使用数组名+指针算术

        数组名本身是一个指针常量,不可被赋值,但可以用它来进行指针+-整数运算,其实与第二种方法一样,就是更直接使用了数组名

int main()
{
	int arr[] = { 1,2,3,4,5 ,6,7,8,9 };

    printf("%d",*(arr+3));
	return 0;
}

        *(arr+3)表示对数组arr的首地址偏移2个单位后所指的元素进行解引用。

2.对数组进行解引用遍历

2.1 使用数组名+索引遍历(最常用)

        最直接的方法,通过数组索引来遍历访问。当然也可以写成*(arr+i)的形式。


int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int i = 0;
	for ( i = 0; i < 5; i++)
	{
	printf("%d\n", arr[i]);
	}
	return 0;
}

2.2 使用指针+索引遍历(分两种写法,常用)

 2.2.1 基本指针遍历(没有移动指针位置)

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

        在上面的代码中,其实ptr指针的位置一直指向的是arr数组首元素地址,通过不断+i的偏移量来访问数组遍历,

 2.2.2指针递增遍历

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	int* ptr = arr;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *ptr++);
		
	}
	return 0;
}

        把arr首元素地址存在指针变量ptr里,使用ptr指针来遍历数组,指针最初指向首元素,然后指针ptr++,递增访问后续元素。

2.3  使用数组名+指针算术遍历(没有移动指针位置)

int main()
{
	int arr[] = { 1,2,3,4,5 ,6,7,8,9 };
	
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for ( i = 0; i < sz; i++)
	{
		printf("%d ",*(arr+i));
		printf("%p\n",(arr+i));//数组首元素的地址,依次加+i哥偏移量
	}

	return 0;
}

        与第二种方法的基本指针遍历道理一样,只是更为直接使用了数组名来解引用,其实arr[i]和*(arr+i)是相等的,所以也可以算是第一种的变形。

3.在函数参数中使用指针

        数组作为函数传参时,其实传的是指向首元素的指针,通过指针+索引访问

        需要注意的是需要定义长度,因为在函数内部使用sizeof(arr)/sizeof(arr[0])时,这个时候的arr已经不代表整个数组,所以sizeof计算的也不是整个数组大小,而是计算的传过来arr这个指针变量的大小,是4个字节。

3.1 数组名+索引遍历

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

3.2 指针递增遍历

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

        以上就是如何对数组进行解引用操作和遍历数组的常用写法总结,当然还有其他各种复杂的写法,考虑常见的和运行效率更好,并且可读性高,这里推荐这几种。可以直接索引遍历也可以通过指针遍历,原理是arr数组名大部分情况=数组首元素的地址,所以将数组名转变为指针来访问。

·        ps:需要的小伙伴们可以用于c语言期末考试中看实际情况写编程题或者函数题用

标签:sz,arr,int,C语言,数组名,数组,写法,ptr,指针
From: https://blog.csdn.net/2301_76684563/article/details/144485733

相关文章

  • Problem: 1338. 数组大小减半 贪心 模拟 法 简单易懂
    Problem:1338.数组大小减半思路因为要选择最小的整数集合,这里用Counter容器来统计下所有各种数字的大小,然后按照值来排序,设置target来表示要到达什么位置,这里最好不要用整除,防止要计算的大于arr,但是len(arr)是奇数,这里total表示删除到这个位置已经删除了多少数字,如果大......
  • 7-4 sdut- C语言实验-矩阵转置
    7-4sdut-C语言实验-矩阵转置分数9全屏浏览切换布局作者 马新娟单位 山东理工大学输入N*N的矩阵,输出它的转置矩阵。输入格式:第一行为整数N(1≤N≤100)。接着是一个N*N的矩阵。输出格式:转置矩阵。输入样例:21212输出样例:1122#include<stdio.h>i......
  • 重生之我在c语言中拿捏转义操作符2
    1⃣️\0是字符串的结束标志,也是strlen在求字符长度时的终点,注意在使用strlen函数是要包括string.h的头文件,图片中的结果是随机值,因为没有遇到\0,abc之后还要多久才可以遇到\0,我们不知道,那我变成arr[3]时结果一样的,那arr[4]时,结果就是3了,因为第四个字符没输入则自动默认为0,相当于看......
  • 写一个方法将一个数组中的元素,从前到后依次两两组合,最后一个与第一个组合
    在前端开发中,你可以使用JavaScript来实现一个方法,将数组中的元素从前到后依次两两组合,并将最后一个元素与第一个元素组合。以下是一个示例代码:functionpairElements(arr){//创建一个空数组来存储结果letpairs=[];//获取数组的长度letlen=arr.......
  • 写一个算法找到数组中两个元素相加等于指定数的所有组合
    在前端开发中,我们可以使用JavaScript来实现一个算法,该算法能够找到数组中两个元素相加等于指定数的所有组合。下面是一个示例代码:/***找到数组中两个元素相加等于指定数的所有组合*@param{number[]}nums-输入数组*@param{number}target-目标和*@returns{A......
  • 写一个方法js将数组对象中某个属性值相同的对象合并成一个新对象
    在前端开发中,处理数组对象并合并具有相同属性值的对象是一个常见的需求。以下是一个使用JavaScript实现的方法,将数组对象中某个属性值相同的对象合并成一个新对象。假设我们要合并的属性名为keyField,并且我们希望将其他属性的值合并为一个数组。/***合并数组中具有相同属性......
  • C语言:数据类型(浮点型、布尔类型)
    2、 浮点型float单精度浮点数【内存大小】float单精度浮点型,能存储整数和小数。在内存中占4个字节(32位)。cout<<"float所占字节数量:"<<sizeof(float)<<endl; 【定义方式】float num=9.8f;  float num=9.8F;【取值范围】有符号的float类型最大值:3.40282e+03......
  • 树状数组详解
    概述树状数组(BinaryIndexedTree,简称BIT),是一种数据结构,用于处理区间查询和更新问题。它是一种可以高效地在对数级别时间复杂度内进行单点更新和区间查询的数据结构。树状数组通常用于解决以下两类问题:区间和查询:给定一个序列,查询序列中任意区间的和。区间更新:给定一个序......
  • c语言素数(升级版)
    回顾还记得素数判断吗?这里面有一个问题,我们只能判断素数,但是无法在一个范围内找出所有素数。今天我们就来借助相关例题讲解一下双层循环实现素数找出。例题本关任务:输入正整数n,输出n以内的全部素数,并输出n以内所有素数个数。分析首先我们需要一个循环,遍历从2(1和小于......
  • 本文针对c语言初学者总是出bug的萌新
    有编译器反馈的读反馈这里来解释一下,方便大家理解编译器输出:        Infunction'main':        13:43:error:expected';'before'scanf'    printf("Enternumberandidfors2:")                 ......