玩转数组 指针参数之c专家编程第九章

原创 2012年03月21日 16:32:35

#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只关心存储的数据内容,不关心空间的大小和类型。

《C专家编程》:指针和数组的区别详解(四)

C语言编程新手常听到的说法之一就是“数组和指针是相同的”。不幸的是,这是一种非常危险的说法,并不完全正确。 一、什么是声明,什么是定义。 注意下面声明的区别: extern int...
  • gogoky
  • gogoky
  • 2016年05月24日 10:21
  • 933

C专家编程--指针与数组(二) 数组 指针 联系

聊过数组和指针的区别,主要是对于数组和指针在内存中的访问方式加以区分,这篇博文则从更深层的角度剖析数组和指针的联系 如果你也对底层感兴趣、我向这篇文章会对你有所帮助, 什么时候数组和指针相同(When...
  • yusiguyuan
  • yusiguyuan
  • 2013年10月06日 20:58
  • 1074

《C专家编程》:深度剖析数组与指针(七)

数组与指针的关系颇有点像诗和词的关系:他们都是文学形式之一,有不少共同之处,但在实际的表现手法上又有各自的特色。---Peter Van Der Linden 在笔记(4)中我们讨论...
  • gogoky
  • gogoky
  • 2016年05月29日 21:23
  • 657

C专家编程整理笔记

C专家编程整理笔记 转自:> 1.关于限定符 C语言规定,合法的指针赋值两个操作数都是指向有限定符或无限定符的相容类型的指针。左边指针所指向的类型 必须是右边指针所指向...
  • pony_maggie
  • pony_maggie
  • 2015年06月28日 20:57
  • 1130

C语言之数组专题:数组指针、指针数组、数组做函数参数退化、数组名、数组类型

 数组专题 1、数组初始化: 数组元素的个数可以显示或隐式指定 int main() { int a[10] = {1,2};//其...
  • wu5215080
  • wu5215080
  • 2014年09月01日 23:26
  • 2319

C专家编程笔记

1.const 最有用之处就是用他来限定函数的形参,这样该函数将不会修改实参指针所指的数据。 2.sizeof(arr[0]) 的写法比sizeof(int)更具有很好的移植性。因为我们可以改数据类...
  • cwj649956781
  • cwj649956781
  • 2013年04月17日 18:00
  • 723

C专家编程 十 规则2: C语言把数组下标作为指针的偏移量(二)

把数组下标作为指针加偏移量足C语言从BCPL (C语言的祖先)继承过来的技巧。在人们的常规思维中,在运行时增加对C语言下标的范围检查是不切实际的。因为取下标操作只是表示将要访问该数组,但并不保证一定要...
  • u014572215
  • u014572215
  • 2016年11月13日 12:22
  • 977

指针数组&数组指针的分配内存及函数参数 C语言版

最近写代码总是被基础知识卡住,十分耽误时间,今天又卡住了。所以下定决心一定要弄清楚这个问题,然后不好的是网上的资料总是解决的并不清楚,总是在纠结什么是指针数组什么是数组指针,看了《C缺陷和陷阱》也没有...
  • WSRspirit
  • WSRspirit
  • 2016年04月29日 20:20
  • 3016

103 一道题目玩转指针数组和二级指针

C学习网:链接->C学习网 C训练网:链接->C训练网 请大家先看下面的代码: #include int main(){ char *lines[5] = { "...
  • czg13548930186
  • czg13548930186
  • 2017年06月06日 00:41
  • 1226

二维指针、二维数组、指向数组的指针 函数参数传递

int arr[3][3] 的本质是指向数组的指针即 int  (*p)[3],所以二维数组名可以传递给foo( int (*arr)[3]) ,或者foo(int [][3]),但是不能传递给foo...
  • kimuwu
  • kimuwu
  • 2014年12月27日 22:44
  • 1904
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:玩转数组 指针参数之c专家编程第九章
举报原因:
原因补充:

(最多只允许输入30个字)