当前位置: 首页 > 知识库问答 >
问题:

c #中指向2D数组增量的指针

狄新翰
2023-03-14
#include<stdio.h>
int main()
{
    int arr[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    printf("%u ,%u\n",arr, &arr+1);
    return 0;
}

在print语句中:(假设整数大小为4字节)
让arr的内存位置为1000

arr 1——给出1016(即下一行内存)

1000 1004 1008 1012 1016

1     2     3    4    5

我理解了逻辑,但我无法理解编译器如何将
arr标识为“指向4整数数组的指针”,并且

即使在增量之前两者都指向相同的地址(1000)

共有2个答案

印嘉泽
2023-03-14

具有极少数异常的表达式中使用的指定数组将转换为指向其第一个元素的指针。

所以数组arr声明如下

int arr[3][4] = { /*...*/ };

当它被用作 printf 调用的参数时,将转换为指向其第一个元素的指针。数组元素的类型是 int[4]。因此,指向此类型对象的指针的类型为 int ( * )[4]

另一方面,表达式<代码>

请注意,您必须使用转换说明符%p来输出指针的值。

printf("%p ,%p\n", (void * )arr, ( void * )( &arr+1 ) );
公冶渝
2023-03-14

arr是一个由int的4元素数组组成的3元素数组。

表达式中的数组会自动转换为指向数组第一个元素的指针(存在一些异常)。因此,arr被转换为指向其第一个元素的指针。第一个元素的类型是“一个int的4元素数组,因此arr4元素数组的指针”( )。

一元的操作数

注意那条线

printf("%u ,%u\n",arr, &arr+1);

通过将具有错误类型的数据传递给 printf()调用未定义的行为。%u 需要无符号的 int。您应该将指针强制转换为 void* 并使用 %p 打印如下所示的指针:

printf("%p ,%p\n",(void*)arr, (void*)(&arr+1));

或者,您可以将指针转换为整数(以实现定义的方式)并打印它们。

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

 类似资料:
  • C++ 数组 您可以先跳过本章,等了解了 C++ 指针的概念之后,再来学习本章的内容。 如果您对 C++ 指针的概念有所了解,那么就可以开始本章的学习。数组名是一个指向数组中第一个元素的常量指针。因此,在下面的声明中: double balance[50]; balance 是一个指向 &balance[0] 的指针,即数组 balance 的第一个元素的地址。因此,下面的程序片段把 p 赋值

  • 主要内容:关于数组指针的谜题数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element)。数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存。以 为例,该数组在内存中的分布如下图所示: 定义数组时,要给出数组名和数组长度,数组名可以认为是一个 指针,它指向数组的第 0 个元素。 在C语言中,我们将第 0 个元素的地址称为数组的首地址。以上面的数组为例,下图是 arr 的指向:

  • 问题内容: 我是Java菜鸟。我已经掌握了将C / C ++指针转换为Java引用的概念,并且进展相当顺利。 我打了一段有指针的代码(即* ptr)。我需要取消引用指针并更改其指向的指针的值(即 ptr =&newthing;) 在Java中这似乎要困难得多。是否有人对如何解决此问题有任何想法?快速谷歌搜索什么都没有。 这是C ++中的代码示例。我想在Java中获得类似的工作,但是ptr_to_p

  • C++ 类 & 对象 一个指向 C++ 类的指针与指向结构的指针类似,访问指向类的指针的成员,需要使用成员访问运算符 ->,就像访问指向结构的指针一样。与所有的指针一样,您必须在使用指针之前,对指针进行初始化。 下面的实例有助于更好地理解指向类的指针的概念: #include <iostream> using namespace std; class Box { public:

  • 但我想使用一个指针,而不是一个简单的变量。能给我点启示吗? 谢谢

  • 在 C 语言中,数组名,&数组名,&数组首元素保存的都是同一个地址 #include <stdio.h> int main(){ int arr[3] = {1, 3, 5}; printf("%p\n", arr); // 0060FEA4 printf("%p\n", &arr); // 0060FEA4 printf("%p\n", &a