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,和上面的结果吻合。
相关文章推荐
- 解析sizeof, strlen, 指针以及数组作为函数参数的应用
- 数组名作为函数参数以及sizeof用法
- sizeof&nbsp;数组名和指针的区别
- a和&a的区别以及数组和指针的用法
- C++数组:数组元素、存储引用以及作为函数参数
- 堆和栈的区别&字符数组,字符指针,sizeof的总结(转)
- sizeof() && 数组名和指针
- sizeof, strlen, 指针和数组作为函数参数
- 所谓"在表达式中,数组名总是被转换为指向该数组第一个元素的指针"应该如何理解?
- 数组和指针的区别(a和&a以及&a[0]的区别)
- 查找标记(指针和数组名作为参数的区别)
- 数组名作为函数参数以及sizeof用法
- C语言学习5:数组定义,数组名的含义,数组作为函数参数,数组赋值,数组左右移动,最大最小,反向遍历,冒泡排序,sizeof 和strlen区别,gets和puts,strcpy,strcat,strcmp,strchr,strstr,strlen
- 巩固:数组作为函数参数& 指针作为函数参数的用法
- 数组指针和指针数组的区别,以及如何利用他们访问数组里面的元素
- 指针 与 数组 以及 a 与 &a的区别
- 数组和指针的区别(a和&a以及&a[0]的区别)
- <C/C++>指向指针的指针、指向数组的指针以及存放指针的数组
- 数组和指针作为函数参数——高质量C、C++编程指南
- C语言中 数组到底是不是指针和数组作为参数问题