数组问题:a与&a有什么不同?

#include <stdio.h>

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

该代码运行结果为:

可见,对于一个数组:

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

a与&a的值是相同的。为什么呢?

a是数组名,是一个数据区的常量,对其取地址(&a)就可以得到数组存储区域的地址,同样,a本身也代表了数组存储区的首地址。所以,a与&a的值是一样的。但是,虽然a与&a指向同一个地址,但是他们的含义是不同的。下面我们修改一下上面的代码看看"a+1"与"&a+1"是否还相等?修改后的代码运行结果为:

可见,a+1的值比a的值大4,即sizeof(a[0]);&a+1比&a的值大20,即sizeof(a)。由此,可得出结论:a+1指向的地址相对与a指向的地址向后偏移了sizeof(a[0])个字节,&a+1指向的地址相对与&a指向的地址向后偏移了sizeof(a)个字节,其描述图如下:

看了这张图,想必大家已经对a与&a有了一个清晰的认识了吧

。下面分析一段代码:

#include <stdio.h>

int main(void)
{
 int a[5] = {0,1,2,3,4};
 int *ptr = (int*)(&a+1);
 
 printf("*(a+1) = %d, *(ptr-1) = %d\n",*(a+1), *(ptr-1));
 
 return 0;
}

运行结果是什么呢?

运行结果为:

*(a+1) = 1, *(ptr-1) = 4

*(a+1) = 1,是因为a+1代表数组第二个元素的地址,即&a[1],*(a+1)为取该地址上的值,即为1;*(ptr-1)=4,是因为ptr指向的是整个数组内存区域之后的内存,即数组最后一个元素之后的地址,ptr-1就是指向数组的最后一个元素,*(ptr-1)为取该地址上的值,即为4。

以上就是今天分享的关于数组的一个小知识点,希望对您有帮助。感谢您的阅读,欢迎持续关注!

每日一句

为了未来美一点,现在必须苦一点。低头不算认输,放弃才是懦夫。

(0)

相关推荐

  • Go 与 C 的指针

    C 和 Go 都是有指针概念的语言,这篇文章主要借这两者之间的异同来加深对 Go 指针的理解和使用. 运算符 C 和 Go 都相同: & 运算符取出变量所在的内存地址 * 运算符取出指针变量所 ...

  • C/C++编程笔记:C数组、字符串常量和指针!三分钟弄懂它

    想弄懂C语言中数组和指针的关系吗?这篇文章就占据你三分钟时间,看完你肯定会有收获! 数组 数组声明为 数据类型 名称[ constant-size ],并将一个数据类型的一个或多个实例分组到一个可寻址 ...

  • 学会这两招,PLC编程也可以批量化定义变量-数组、结构

    数组 简单的说,就是多个相同类型数据一定顺序排列的集合,使用一个名字命名,并通过编号的方式对这些数据统一管理. 在PLC编程过程中,我们也经常遇到同类型的变量需要定义,例如10台电机的电流值,如果不使 ...

  • C语言0数组/柔性数组使用介绍

    前言: 我自己在这篇文章下面做了一些回复. 现在我想结合我自己的理解,解释一下这个 char[0] C语言柔性数组的问题. 作者:良知犹存 转载授权以及围观:欢迎关注微信公众号:羽林君 或者添加作者个 ...

  • 【C语言核心基础】基本运算、变量、数组、指针、函数、结构体...

    C 语言基础 // 引入头文件.里面包含了重要的 printf. #include <stdio.h> // 入口函数. // 参数一指输入的参数个数,参数二保存了所有参数. // 返回值 ...

  • 在PHP中灵活使用foreach+list处理多维数组

    先抛出问题,有时候我们接收到的参数是多维数组,我们需要将他们转成普通的数组,比如: $arr = [ [1, 2, [3, 4]], [5, 6, [7, 8]],]; 我们需要的结果是元素1变成1, ...

  • VB中怎样对一个二维数组的行进行操作

    通常,数学上的行列式或者矩阵,用二维数组来存放数据,二维数组的第1维,就是映射矩阵的行,二维数组的第2维,就是映射矩阵的列. 例如: dim d(1 To 3,1 To 4) As Integer 对 ...

  • 数组及Arrays类

    数组是相同类型的有序集合 数组的下标是从0开始的,所以数组中的最大下标为该数组长度减1 初始化数组的三种方式: //动态初始化:先创建后赋值int[] name=new int[10];//确立了数组 ...

  • 如何将二维数组作为函数的参数传递

    今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...

  • Excel数组入门之计算规则

    问题:{1,2,3;4,5,6} 是几行几列? 如果这个问题,你能回答出来,那么说明你对水平和垂直数组有了清晰的认识.如果没有也没有关系,下面我们就带大家先认识一下,然后再谈计算规则! 常量数组写法 ...

  • 数组入门

    数组,函数进阶门槛,但是对于很多人是很难跨的一道坎.想写数组很久了,虽然自己已轻车熟路,但是让别人听懂却不是一件容易的事,今日路上偶有一感,或许能带大家一起入个门! 先抛开那些无聊的概念,我们直接通过 ...

  • OFFSET进阶引用之参数数组化

    OFFSET共5个参数,除了第一参数必须是引用,其他参数都可以数组化,且最多可能形成四维!到这新手应该已经关闭本文了! 第一参数如果是区域,理解起来会更吃力,我们先通过一组测试来了解一下OFFSET数 ...