您的位置:首页 > 其它

C和指针之数组名和&数组名和&首元素以及sizeof(数组名)和sizeof(数组名作为参数)区别

2017-11-11 21:39 549 查看

1、先看我的测试Demo

#include <stdio.h>
#include <stdlib.h>

int get_size(int *p)
{
int size = sizeof(p);
return size;
}

int main()
{
int a[6] = {1, 2, 3, 4, 5, 6};
int b[] = {1, 2, 3, 4, 5, 6};
int c[10] = {1, 2, 3, 4, 5, 6};

int size_a = sizeof(a);
int size_b = sizeof(b);
int size_c = sizeof(c);

printf("a size is %d\n", size_a);
printf("b size is %d\n", size_b);
printf("c size is %d\n", size_c);

int size =  get_size(a);
printf("size is %d\n", size);

printf("a is %d\n", a);
printf("&a[0] is %d\n", &a[0]);
printf("&a is %d\n", &a);

printf("a + 1 is %d\n", a + 1);
printf("&a[0] + 1 is %d\n", &a[0] + 1);
printf("&a + 1 is %d\n", &a + 1);

return 0;
}



2、运行结果

1111deMacBook-Pro:dabian a1111$ vim array_name.c
1111deMacBook-Pro:dabian a1111$ gcc -g -w array_name.c -o array_name
1111deMacBook-Pro:dabian a1111$ ./array_name
a size is 24
b size is 24
c size is 40
size is 8
a is 1358666672
&a[0] is 1358666672
&a is 1358666672
a + 1 is 1358666676
&a[0] + 1 is 1358666676
&a + 1 is 1358666696




3、总结分析

      1、分析初始化

            数组b[],声明的时候没有给出数组的长度,编译器会把数组的长度设置为刚好能够容纳所有的初始值的长度,其实和声明数组a[6]效果一样。数组c[10] 声明只有6个元素,后面4个元素默认初始化为0.

      2、分析数组的大小和数组名作为参数传递给函数在此内部求大小

            数组名的值是个指针常量,也就是数组第一个元素的地址。 它的类型取决于数组元素的类型:如果它们是int类型,那么数组名的类型就是“指向int的常量指针,在以下两中场合下,数组名并不是用指针常量来表示,就是当数组名作为sizeof操作符和单目操作符&的操作数时。 sizeof返回整个数组的长度,而不是指向数组的指针的长度。 取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针,所以sizeof返回整个数组的长度,当数组名作为函数参数传递给函数的时候,数组名就是一个指向第一个元素的指针,所以此时传递的是函数厄一份该指针的拷贝,所以这个时候在函数里面求这个用sizeof求这个指针的大小,很明显不是数组的长度了,就是普通指针的长度了,我的笔记本是64位操作系统,所以指针的大小是8.

     3、分析数组名和&数组名和&首元素和数组名+1和&数组名+1和首元素+1

           数组名就是首元素的地址,我们可以理解数组名和首元素是等价的,然后&数组名是指向数组的指针,在这里,这3个值是一样的。
           数组名+1和&首元素+1的效果是一样,都是地址+1,因为指针指向int,所以+1之后,指针大小会增加4,所以这个时候这2个指针指向元素2,然后&数组名+1,什么意思,既然&数组名是指向数组的指针,&数组名+1,也就意味着指针指向了下一个数组的地址,也就是元素6地址的后面一个地址,他们之前相差5个元素,所以指针大小应该相差4 * 5 =20,和上面的结果吻合。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: