首页 > 其他分享 >通过指针引用数组

通过指针引用数组

时间:2024-08-19 19:23:02浏览次数:13  
标签:arr 变量 int len 引用 数组 指针

数组元素的指针

数组指针:数组中的第一个元素的地址,也就是数组的首地址。

指针数组:用来存放数组元素地址的数组,称之为指针数组。

// 定义一个一般数组
int a[] = {1,4,9};
// 使用指针变量存储数组的第一个元素的首地址,也就是数组的首地址
int *p = &a[0];// 数组首地址
// 在C语言中,由于数组名代表数组的首地址,因此,数组名实际上也是指针。
int *p = a;
// 意味着:int *p = &a[0] 完全等价于 int *p = a;
printf("%d\n",*p); // 1

注意:虽然我们定义了一个指针变量接收了数组地址,但不能理解为指针变量指向了数组,而应该理 解为指向了数组的元素

指针的运算

指针运算:指针变量必须要指向数组的某个元素。

 

#include <stdio.h>
int main()
{
// 一般数组
int a[] = {1,3,5,7,9};
// 计算数组中元素的个数
// sizeof用法:sizeof(运算数) 或者 sizeof 运算数
int len = sizeof a / sizeof a[0];
// 创建指针变量
int *p = a;
// 创建循环变量
register int i = 0;
// 遍历
for(;i < len; i++)
{
printf("[1] %d ",a[i]); // 下标法
printf("[2] %d ",*(a+i));// 指针法,但是这种写法,需要注意,a+i无法修改数组,只读
printf("[3] %d ",*(p+i));// 指针法,这种更为灵活,可读可写,建议这种写法
p++;
// printf("%d\n",*p); // 等价于上面写法
// p++;
}
printf("\n");
return 0;
}

 数组名做函数参数

 表现形式:

1. 形参和实参都用数组名

2. 实参用数组名,形参用指针变量

3. 实参形参都用指针变量

void fun(int *p1){}
void main()
{
// 注意:如果实参和形参都是指针,我们的实参需要初始化
int arr[2] = {23,34};
int *p0 = arr;
fun(p0);
}

4. 实参为指针变量,形参为数组名

 案例:

/**
* 需求:将数组a中n个整数按相反顺序存放。
*/
#include <stdio.h>
/* 数组的反转:数组实现*/
void inv(int arr[],int len)
{
// 反转思路:将第0个和n-1个进行对掉,将第1个和n-2个对掉..
// 定义循环变量i,临时变量temp
int i = 0,temp;
// 遍历数组
for(;i < len/2;i++)
{
// 交换
temp = arr[i];
arr[i] = arr[len-1-i];
arr[len-1-i] = temp;
}
}
/*
数组的反转:指针实现
关键字:const 给变量的数据类型前面添加const,代表这个变量是只读变量,无法对此作出修改
*/
void inv2(int *arr,const int len)
{
// 反转思路:将第0个和n-1个进行对掉,将第1个和n-2个对掉..
// 定义循环变量i,临时变量temp *j = &arr[len -1] 等价于 arr + len -1
int *i = arr,*j = &arr[len-1],temp;
// 遍历数组
for(;i < j;i++,j--)
{
// 交换
temp = *i;
*i = *j;
*j = temp;
}
}
int main()
{
int array[10] = {12,23,45,55,66,77,88,26,34,32};
int len = sizeof(array)/sizeof(int);
inv2(array,len);
// 测试是否反转
for(int i = 0;i < len;i++) printf("%d,",array[i]);
printf("\n");
return 0;
}

 数组指针

数组指针:指向一维数组的指针变量。

数组指针定义:假定该指针变量指向具有N个元素的一维数组,则数组指针变量定义如下:

        数据类型 (*数组指针变量名)[N];

一维数组:

int a[N] = {1,2,3};

int (*p)[N] = &a;

二维数组:

int a[][N] = {1,3,5,7};

int (*p)[N] = a[0];// &a[0][0]

案例:

/**
* 数组指针: 用指向元素的指针变量输出二维数组元素的值
*/
#include <stdio.h>
int main()
{
// 定义一个普通的二位数组
int a[3][4] = {1,3,5,7,9,11,13,15,17,19,21,23};
int *p = &a[0][0];// 二维数组 等价于 a[0]
// 循环遍历
for(;p < a[0]+12;p++)
{
if((p - a[0]) % 4 == 0)
{
printf("\n");
}
printf("%4d",*p);
}
printf("\n");
return 0;
}

函数的传参

 值传递:一般发生在函数形参的类型为char、short、int、long、float、double这样的类型,它的传 递,一般是实参将自己的值复制一份给形参,也就是实参变量和形参变量的变量空间是分开的。此 时形参无法改变实参的数据。

引用传递:一般发生在函数形参的类型为数组、指针这样的类型,它的传递,一般是实参将自己的 内存首地址复制一份给形参,也就是实参变量和形参变量对应内存空间是同一个。此时形参可以改 变实参的数据。

 

标签:arr,变量,int,len,引用,数组,指针
From: https://blog.csdn.net/m0_74834289/article/details/141205743

相关文章

  • 03-Matlab数组与矩阵
    数组的建立和操作数组算术运算数组信息获取矩阵的建立矩阵的扩展矩阵的块操作矩阵中元素的删除赋值为一对方括号矩阵的转置加点不转置为共轭复数没点的转置为共轭复数矩阵的旋转矩阵的翻转矩阵尺寸的改变矩阵加减法矩阵乘法矩阵除法矩阵中元素......
  • C/C++语言基础--指针三大专题详解2(指针与数组关系,动态内存分配,代码均可)
    本专栏目的更新C/C++的基础语法,包括C++的一些新特性前言指针是C/C++的灵魂,和内存地址相关联,运行的时候速度快,但是同时也有很多细节和规范要注意的,毕竟内存泄漏是很恐怖的指针打算分三篇文章进行讲解,本专题是二,介绍了指针和数组的关系、动态内存如何分配和释放等问题专题......
  • 实现strStr() —— KMP算法(包含next数组的优化)
    目录KMP算法KMP算法的应用前缀表最长公共前后缀为什么要使用前缀表如何计算前缀表前缀表和next数组时间复杂度分析例题28.实现strStr构造next数组 使用next数组来做匹配 前缀表统一减一C++代码实现前缀表(不减一)C++代码实现总结 拓展:next数组的优化 KMP算......
  • vue 数组和对象更新检测
    vue如果要更新v-for渲染出来的数据,它是不会操作dom元素的。而是就地更新需要操作的元素,并且确保它们在每个索引位置正确渲染。为了给vue一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有的元素,你需要为每项提供一个唯一Keyattribute;<divv-for="(item,index)i......
  • 深入理解指针!!!由浅入深!!1
    1.内存与地址1.1内存计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,而内存空间是如何高效的管理的呢?其实是把内存划分成为一个个的内存单元,每个内存单元的大小取1个字节。每个内存单元也都一个编号,有了这个内存单元的编号,CPU......
  • torch.stack 堆叠函数帮助理解多维数组
    概论在PyTorch中,torch.stack函数用于在指定的维度上将一组张量堆叠起来。这个操作会在指定维度上创建一个新的维度,并将输入张量在该维度上进行堆叠。假设有两个形状相同的张量a和b,它们的形状都是(2,3,4),那么在不同的dim参数下使用torch.stack会产生不同的结果。以......
  • 总结指针数组与数组指针的区别
    1、指针数组1-1、定义指针数组是一个数组,其元素是指针。这意味着数组的每个位置都存储了一个指针,这些指针可以指向任何类型的数据(包括其他数组、结构体等)。1-2、类型如果有一个指向整数的指针数组,其类型可能是 int*arr[N];,这里 arr 是一个数组,包含 N 个 int* 类型......
  • Python爬虫:网页脚注与引用的智能捕手
    标题:Python爬虫:网页脚注与引用的智能捕手在数字化信息的海洋中,网页脚注和引用是丰富内容、提供来源的重要方式。然而,对于Python爬虫而言,如何精准捕捉这些细微信息,成为了一项挑战。本文将深入探讨Python爬虫在处理网页中的脚注和引用时的策略与技巧,通过实例代码展示其高效性......
  • 值类型和引用类型、装箱和拆箱、静态类和普通类、方法的重载、继承和多态、访问修饰符
    目录一、值类型和引用类型的区别?值类型(ValueTypes)定义:特点:示例:引用类型(ReferenceTypes)定义:特点:示例:举例说明:总结:二、装箱和拆箱装箱(Boxing)特点:示例:拆箱(Unboxing)特点:示例:示例代码:装箱和拆箱的影响最佳实践:三、静态类和普通类的区别?静态类(Static......
  • 六、熟知java(类和对象--引用和继承)
    熟知java(类和对象–引用和继承)一、什么是JAVA中的引用?引用的概念,如果一个变量的类型是类类型,而非基本类型,那么该变量又叫做引用。二、引用和指向newRole();代表创建了一个Role对象,但是只是创建,并不能访问它,为了访问它,我们会使用引用来代表这个对象:Roler=newRol......