首页 > 其他分享 >指针(二):数组指针

指针(二):数组指针

时间:2024-08-28 09:50:59浏览次数:14  
标签:arr int 地址 数组 printf 指针

目录

数组名的理解

在介绍数组指针之前先通过一段代码了解一下数组名的本质是什么。

#include<stdio.h>

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

第一行代码我们取出数组第一个元素的地址放在p1里面,第二行将数组名直接赋值给p,如图,以地址的形式打印出来的地址一模一样,说明数组名本质上就是数组首元素的地址。
同时也说明我们调用函数时以数组为参数传参时传的也就是数组首元素地址。
在这里插入图片描述
但是在一些特殊情况下的数组名不代表首元素的地址。
如:
sizeof(数组名):sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,单位是字节。
&数组名:这里取地址取的是整个数组的地址。
除了这两种情况,其他的地方使用数组名都是数组首元素地址。
这个时候就会有人好奇去尝试打印整个数组的地址,如下列带代码:

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

发现三个打印的地址一模一样,那数组整个地址与数组首元素地址区别是什么?

数组整个地址与数组首元素地址区别

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

在这里插入图片描述
上述代码中printf两行为一组,每一组代码都是取出来一个地址给地址加1。
可以看出来前两组代码的值变化都是4个字节(原因在上一篇指针(一)里面介绍过),而最后一组变化范围很大。
原因就是最后一组取出来的是整个数组的地址,让地址加1就是加整个数组的大小的地址,这段代码中arr的大小是40个字节,所以让整个数组的地址加1也就是加40个字节,但是取数组地址并用printf打印也是打印数组首元素的地址。

指针的形式访问数组

用指针的形式来输入和输出数组:

int main()
{
	int arr[5] = { 0 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		scanf("%d", arr + i);//arr数组首元素地址,循环一次加1
	}
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(arr+i));//每循环一次地址加1并解引用
	}
	return 0;
}

运行结果如图:
在这里插入图片描述
这只是指针的一种描写形式,还有很多形式与它等价,代码与结构如下图所示:
在这里插入图片描述

冒泡排序

冒泡排序本质上就是相邻两个地址之间进行比较然后进行排序。

void bubble_sort(int arr[], int sz)//参数接收数组元素个数{
 int i = 0;
 for(i=0; i<sz-1; i++)
 {
 int flag = 1;//假设这⼀趟已经有序了
 int j = 0;
 for(j=0; j<sz-i-1; j++)
 {
 if(arr[j] > arr[j+1])
 {
 flag = 0;//发⽣交换就说明,⽆序
 int tmp = arr[j];
 arr[j] = arr[j+1];
 arr[j+1] = tmp;
 }
 }
 if(flag == 1)//这⼀趟没交换就说明已经有序,后续⽆序排序了 break;
 }
}
int main()
{
 int arr[] = {3,1,7,5,8,9,0,2,4,6};
 int sz = sizeof(arr)/sizeof(arr[0]);
 bubble_sort(arr, sz);
 int i = 0;
 for(i=0; i<sz; i++)
 {
 printf("%d ", arr[i]);
 }
 return 0;
}

二级指针

在我们取变量地址时会创建一个指针变量来存放这个地址,有变量就会有地址,二级指针就是用来存放指针变量地址的变量。

int main()
{
	int a = 0;
	int* p = &a;//一级指针
	int** p = &p;//二级指针
	return 0;
}

那么二级指针怎么找到变量a呢?
对它进行两次解引用就好了:第一次解引用找到p,找到p后再对p进行解引用就找到了a。

指针数组

整形数组是代表数组的每个元素都是整形,那指针数组也就是说每个数组元素都是一个指针变量。

int* arr[5]={a,b,c,d,e};//这里a,b,c,d,e都是一个整形类型的指针变量

指针数组模拟二维数组

int main()
{
	int arr1[3] = { 1,2,3 };
	int arr2[3] = { 4,5,6 };
	int arr3[3] = { 7,8,9 };
	int* arr4[3] = { arr1,arr2,arr3 };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%d", arr4[i][j]);
		}
		printf("\n");
	}
	return 0;
}

在这里插入图片描述
-----------------------分隔符
关于数组指针的内容就介绍完了,感谢观看。
有错请指正,谢谢。

标签:arr,int,地址,数组,printf,指针
From: https://blog.csdn.net/qq_71391318/article/details/141571661

相关文章

  • 指针(三):函数指针
    目录函数指针函数的地址函数指针结构函数指针数组了解函数指针数组函数指针数组结构简易计算器函数指针数组优化计算器函数指针函数的地址函数指针,也就是存放函数地址的变量,有人会问,函数也会有地址吗?我们用一个代码来验证一下吧。#include<stdio.h>voidtest(......
  • C++智能指针
    1.为什么需要智能指针大家来看下面这段程序我们new了两个arraydoubleDivision(inta,intb){ //当b==0时抛出异常 if(b==0) { throw"Divisionbyzerocondition!"; } return(double)a/(double)b;}voidFunc(){ int*array1=newint[10]; int*......
  • 【Leetcode_Hot100】普通数组
    普通数组53.最大子数组和56.合并区间189.轮转数组238.除自身以外数组的乘积41.缺失的第一个正数53.最大子数组和方法一:暴力解依次遍历数组中的每个子数组,进而判断res的最大值超时classSolution{publicintmaxSubArray(int[]nums){intres=0;......
  • 深入理解指针(1)
    1.内存和地址1.1内存我们知道CPU(中央处理器)在处理数据的时候,需要的数据在内存中读取,处理后的数据也会放回内存中。那么如何提高内存空间的管理呢?其实也就是把内存分为一个个内存单元,每个内存单元的大小是一个字节,其中一个字节的大小相当于8个比特位(bit)。每一个内存单......
  • 数组学习
    1.概念数组是相同类型数据的有序集合每一个数据都称为数组元素2.数组的使用1.声明一个数组:可以在类型后加[](首选)或者在名称后加[](为了方便c和c++语言而设计)2.创建一个数组,并设置内存3.给数组赋值总览3.使用数组长度来计算数组总和如果想计算数组里的数的总和,可......
  • 合并两个排序的数组
     输入:nums1=[1,2,3,0,0,0],m=3nums2=[2,5,6],n=3输出:[1,2,2,3,5,6] publicvoidmergeArray(int[]nums1,intm,int[]nums2,intn){inti=m-1;intj=n-1;intindex=m+n-1;while(index>=0){......
  • C++面试基础系列-this指针
    系列文章目录文章目录系列文章目录C++面试基础系列-this指针Overview1.this指针1.1.特性1.2.用法1.3.注意事项2.使用'this'指针的多态类的示例3.在C++中,指针和对象本身有什么区别?关于作者C++面试基础系列-this指针Overview1.this指针在C++中,this指针是一......
  • GET传递数组参数
    前端通过HTTPGET请求向后端传递List类型参数。方法一、直接以数组形式传递id=[2,4,6]后端:以数组类型接收,再转换为List类型。//请求URLhttp://127.0.0.1:8080/getTeachers?name=王五,刘麻子//后台接口代码@RestController@RequestMapping("/")publicclassSpringM......
  • 【C#】数组转置
    【需求】现有一个需求,3行4列的从左到右从上到下的数组,转成4行3列,如图所示: 【实现方法】通过C#编码实现,两种方法:第一种方法:publicdouble[]transpose(double[]src,intw,inth){double[]dst=null;if(src==null||src.Length!=w*h||w==0......
  • 探索C语言中数组作为函数参数的奥秘
    在C语言的世界里,数组是一种基础且强大的数据结构,它允许我们存储相同类型的数据集合。然而,在处理函数和数组的关系时,尤其是在数组作为函数参数传递时,初学者往往会感到困惑。今天,我们就来深入探讨这一话题,通过具体的代码示例来揭开其神秘面纱。数组作为函数参数的两种形式在C语......