玩转数组 指针参数之c专家编程第九章
2012-03-21 16:32
274 查看
#include "stdafx.h"
#include "string.h"
#include "stdio.h"
char ga[] = "abcdefgh";
void my_array_func(char ca[10])
{
printf(" addr of array param = %#x \n",&ca);
printf(" addr (ca[0]) = %#x \n",&(ca[0]));
printf(" addr (ca[1]) = %#x \n",&(ca[1]));
printf(" *ca = %c \n", *(ca));
printf(" ca[0] = %c \n", ca[0]);
printf(" strlen(ca) = %d\n",strlen(ca));
printf(" ++ca = %#x \n\n",++ca);
}
void my_pointer_func(char *pa)
{
printf(" addr of ptr param = %#x \n", &pa);
printf(" addr (pa[0]) = %#x \n", &(pa[0]));
printf(" addr (pa[1]) = %#x \n", &(pa[1]));
printf(" *pa = %c \n", *(pa));
printf(" ++pa = %#x \n",++pa);
printf(" sizeof(pa) = %#x ,sizeof(*pa) = %#x \n",sizeof(pa),sizeof(*pa));//sizeof计算()内占用的长度
printf(" strlen(pa) = %d \n",strlen(pa));//从偏移量为1往后开始计算存储内容的长度,strlen计算所指向内容总的长度。
}
int main()
{
printf(" addr of blobal array = %#x \n",&ga);
printf(" addr (ga[0]) = %#x \n", &(ga[0]));
printf(" addr (ga[1]) = %#x \n\n", &(ga[1]));
my_array_func(ga);
my_pointer_func(ga);
return 0;
}
运行结果如下:
数组参数的地址和数组参数的第一个元素的地址竟然不一样。
对了,就是不一样,在函数的形参当中,数组和指针最终编译器最终都是转化为指针来处理,所以会出现上述结果。
输出结果中倒数第二行说明了这个。
意外总结:sizeof返回定义arr数组时,编译器为其分配的数组空间大小,不关心里面存了多少数据。strlen只关心存储的数据内容,不关心空间的大小和类型。
#include "string.h"
#include "stdio.h"
char ga[] = "abcdefgh";
void my_array_func(char ca[10])
{
printf(" addr of array param = %#x \n",&ca);
printf(" addr (ca[0]) = %#x \n",&(ca[0]));
printf(" addr (ca[1]) = %#x \n",&(ca[1]));
printf(" *ca = %c \n", *(ca));
printf(" ca[0] = %c \n", ca[0]);
printf(" strlen(ca) = %d\n",strlen(ca));
printf(" ++ca = %#x \n\n",++ca);
}
void my_pointer_func(char *pa)
{
printf(" addr of ptr param = %#x \n", &pa);
printf(" addr (pa[0]) = %#x \n", &(pa[0]));
printf(" addr (pa[1]) = %#x \n", &(pa[1]));
printf(" *pa = %c \n", *(pa));
printf(" ++pa = %#x \n",++pa);
printf(" sizeof(pa) = %#x ,sizeof(*pa) = %#x \n",sizeof(pa),sizeof(*pa));//sizeof计算()内占用的长度
printf(" strlen(pa) = %d \n",strlen(pa));//从偏移量为1往后开始计算存储内容的长度,strlen计算所指向内容总的长度。
}
int main()
{
printf(" addr of blobal array = %#x \n",&ga);
printf(" addr (ga[0]) = %#x \n", &(ga[0]));
printf(" addr (ga[1]) = %#x \n\n", &(ga[1]));
my_array_func(ga);
my_pointer_func(ga);
return 0;
}
运行结果如下:
数组参数的地址和数组参数的第一个元素的地址竟然不一样。
对了,就是不一样,在函数的形参当中,数组和指针最终编译器最终都是转化为指针来处理,所以会出现上述结果。
输出结果中倒数第二行说明了这个。
意外总结:sizeof返回定义arr数组时,编译器为其分配的数组空间大小,不关心里面存了多少数据。strlen只关心存储的数据内容,不关心空间的大小和类型。
相关文章推荐
- C专家编程 十三 数组和指针参数是如何被编译器修改的
- C专家编程--数组和指针如何被编译器修改的
- C专家编程 九 什么时候数组与指针相同(一)
- C 专家编程笔记(三) 数组和指针
- 【C专家编程】第4章 数组和指针并不相同
- 玩转数组/指针参数
- C专家编程-数组和指针并不相同
- 数组和指针 [C专家编程]
- C专家编程 十 规则2: C语言把数组下标作为指针的偏移量(二)
- C专家编程 十五 使用指针向函数传递一个多维数组
- C专家编程——第四章:数组与指针并不相同
- C专家编程--数组与指针(一)数组 指针 访问方式 区别
- 令人震惊的事实:数组和指针并不相同——C专家编程
- C专家编程之为什么C语言把数组形参当做指针:数组/指针实参
- C专家编程--指针与数组(二) 数组 指针 联系
- 指针和数组(C专家编程笔记)
- C语言指针与数组(C专家编程)
- C专家编程学习之第四章 数组和指针
- C专家编程--指针和数组(三) 值传递 指针传递 引用传递
- C专家编程--指针和数组(四) 指针对数组的访问