指向数组的指针与数组名称有何不同?

时间:2015-06-25 08:13:13

标签: c arrays pointers sizeof pointer-to-array

我正在阅读有关C中数组与指针的更多内容,并编写了以下程序。

#include <stdio.h> 

int arr[10] = { } ; 
typedef int (*type)[10]  ;
int main()
{
   type val = &arr ; 
   printf("Size is %lu\n", sizeof(val)) ; 
   printf("Size of int is %lu\n", sizeof(int)) ;
}

如果我执行此程序,则sizeof(val)为8,sizeof(int)为4。

如果val是指向包含10个元素的数组的指针,那么它的大小不应该为40.为什么sizeof(val) 8?

6 个答案:

答案 0 :(得分:3)

  

如果val是指向数组的指针......

是的,而且SET myFolder D:\temp\img\ TAG POS=4 TYPE=IMG ATTR=SRC:/upload/images/* EXTRACT=HREF SET !EXTRACT EVAL("'{{!EXTRACT}}'.match(/\/upload\/images\/(.*)image\.jpg/)[1];") SET !EXTRACT EVAL("'{{!EXTRACT}}'.replace(/\\//g, '\\\\');") ADD myFolder {{!EXTRACT}} ONDOWNLOAD FOLDER={{myFolder}} FILE=image.jpg WAIT=YES TAG POS=4 TYPE=IMG ATTR=SRC:/upload/images/* CONTENT=EVENT:SAVEPICTUREAS 产生&#34; 指针到数组&#34;的大小,而不是数组本身。

  

...不应该是40岁。

不,sizeof(val)计算操作数的大小,&#34;指针&#34;这里。在您的平台中,指针的大小似乎是64位,即8字节。所以,它给出了sizeof(val)

另外,正如我所提到的,使用8打印%zusize_t运营商生成的类型。

答案 1 :(得分:3)

首先是数组的初始化

int arr[10] = { } ; 
C中的

无效。您不能在C中使用emplty括号(在C ++中它们是允许的)。你必须写

int arr[10] = { 0 } ; 

在C中,相应的初始化程序按以下方式定义

initializer:
    { initializer-list }
    { initializer-list , }

在C ++中

braced-init-list:
    { initializer-list ,opt }
    { }

至于这句话

printf("Size is %lu\n", sizeof(val)) ; 

然后val是一个指针,因为它的类型type定义为

typedef int (*type)[10]  ;

将此声明更改为

printf( "Size is %zu\n",  sizeof( *val ) ); 

如果你想得到指针指向的对象(即数组)的大小。

答案 2 :(得分:0)

sizeof返回指针本身的大小。在64位系统中,它是8个字节。 指针不知道它们指向的缓冲区大小。

答案 3 :(得分:0)

JavaRDD<Record> data = sc.parallelize( Lists.newArrayList( new Record(33, "Jack", "USA"), new Record(24, "Sam", "USA"), new Record(24, "Dan", "USA"), new Record(31, "Jack", "USA"))); JavaRDD<Record> sorted = data.sortBy(rec -> rec, true, data.partitions().size()); System.out.println(sorted.collect()); //define bean class Record implements Serializable, Comparable<Record> { private int age; private String name; private String country; public Record(int age, String name, String country) { this.age = age; this.name = name; this.country = country; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } @Override public int compareTo(Record o) { int compAge = Integer.compare(this.age, o.age); if (compAge != 0) return compAge; else return this.name.compareTo(o.name); } @Override public String toString() { return new ToStringBuilder(this) .append("age", age) .append("name", name) .append("country", country) .toString(); } } 是一种不同的数据类型,并且始终具有固定大小。将指针视为指向实际数据的符号,并且符号始终具有相同的大小 - 无论它指向单个字符还是更大的数组。

答案 4 :(得分:0)

val是指针,其大小等于系统的地址总线大小。 因此,sizeof(val)sizeof(anyPointer)会将8作为输出。 如果您需要40,请尝试sizeof(arr)

指向数组的指针是简单的指针,您可以在其中编写val++,而数组名称为constant pointer则无法编写arr++

您还可以查看此link

答案 5 :(得分:0)

很可能你在64 bit PC中,其中内存地址需要64 bits8 byte空间来表示。

现在pointer实际上保存了内存地址,而它可能包含int的地址或int[]的地址,并不重要。

所以,当你执行时,

printf("Size is %lu\n", sizeof(val)) ; 

它显示8因为指针包含需要64 bits空格的地址。

并且

printf("Size of int is %lu\n", sizeof(int)) ;

此行只打印int的大小4字节。