数组名和函数名的一个特征
2011-09-29 14:48
246 查看
#include<stdio.h> void hello(void); int main(void) { int a[10]; char *b[10]={ "hello", "world" }; char *c[10]; printf("%p\t%p\t\n",hello,&hello); printf("%p\t%p\t%p\t\n",a,&a,&a[0]); printf("%p\t%p\t%p\t%p\t\n",b,&b,b[0],&b[0]); printf("%p\t%p\t%p\t\n",c,&c,&c[0]); return 0; } void hello(void) { }
输出
0x40061a 0x40061a 0x7fff3773b7f0 0x7fff3773b7f0 0x7fff3773b7f0 0x7fff3773b7a0 0x7fff3773b7a0 0x40070c 0x7fff3773b7a0 0x7fff3773b750 0x7fff3773b750 0x7fff3773b750
结论:对于函数名和数组名而言
int a[];
a和&a和&a[0]的值都是一样的
void hello(void);
hello和&hello是一样的
这也就是为什么
void ToUpper(char *);
void(*pf)(char *);
pf=ToUpper;//pf=&ToUpper也是可以的
调用的时候(*pf)();和pf();都可以的原因了
对于一个二维数组来讲,有6个值都是一样的 #include<stdio.h> int main(void) { int b[10][3]; printf("%p\t%p\t%p\t%p\t%p\t%p\n",b,&b,&b[0],b[0],*b,&b[0][0]); return 0; } //结果 0x7fff229e2dd0 0x7fff229e2dd0 0x7fff229e2dd0 0x7fff229e2dd0 0x7fff229e2dd0 0x7fff229e2dd0
值虽然一样,但是类型不一样,这点要注意区分
我这里分析以下值为什么会一样
在内存来面如何来定位一个值呢?很简单,地址加值的长度,地址常常由基址加偏移量来确定,而值的长度由值的类型来确定
那么一个值在内存中有时候占的不是一个字节,值的地址是那个字节的地址呢?C语言规定,第一个字节的地址为值的地址。
int a[10];
那么数组的地址(&a)就是数组第一个元素的地址(&a[0])。并且在表达式中数组名(a)退化为一个指针,也指向的是第一个元素的地址(&a[0])
这就是为什么他们的值相等的原因了
但是要注意类型不一样,一定要注意
int (*pa)[10]=&a;
int *pa=a;
一个是指向数组的指针,一个是指向整数的指针。
那我们这里说指向是什么意思呢?
比如说int b;
int *c=&b;
这里才说c是指向b的,就是说指针的值等于所指向的值的地址。
c专家编程213页混淆了这个概念。可能表述不清,或许翻译有误,总之花了我一晚上的时间
来求证这个东西,好在概念更加清晰了。
相关文章推荐
- 一个复杂的声明,包含数组指针,指针数组,函数指针和指针函数的区别
- 二、 编写函数int stat(int a[],int n,int c[][2])。a指向的数组中保存了由n个1位整数组成的数列(n为偶数)。函数从前至后依次将a数组中每两个相邻元素拼成一个不超过2位
- 已知一个数组,每一行都按照从左到右递增的顺序排序, 每一列都按照从上到下递增的顺序排序。请完成一个函数, 输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
- 主函数创建5个学生的数组,写一个排序函数,让学生按姓名从小到大排序,主函数输出排序后的结果。
- 使用Angularjs获取数组中的值利用一个函数的返回值来决定相应的dom是否生成
- 每天一个数组函数
- 在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 有两个升序排列的数组A1和A2,给A1开辟的剩余内存有足够空间容纳A1,请实现一个函数,把A2中所有数字插入到A1中,并且是按照升序排列的
- 写一个函数找出一个整数数组中,第二大的数
- 写一个函数求一个整数数组中第二大元素
- 《c primer pius》第十章第6题,编写一个程序,初始化一个二维double数组,并利用练习2中的任一函数来把这个数组复制到另一个二维数组(因为二维数组是数组的数组,所以可以使用处理一维数组的
- 创建一个数组, 实现函数init()初始化数组、 实现empty()清空数组、 实现reverse()函数完成数组元素的逆置。
- 整型数组处理算法(十一)请实现一个函数:线段重叠(性能优化)。[风林火山]
- PHP array_combine() 函数,合并两个数组来创建一个新数组
- 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 创建一个数组,实现函数init()初始化数组,实现empty()清空数组,reverse()函数完成数组的逆置
- 写一个函数找出一个整数数组中,第二大的数
- php使用array_rand()函数从数组中随机选择一个或多个元素
- 编写函数int stat(int a[],int n,int c[][2])。a指向的数组中保存了由n个1位整数组成的数列(n为偶数)。函数从前至后依次将a数组中每两个相邻元素拼成一个不超过2位
- C专家编程 十五 使用指针向函数传递一个多维数组