C专家编程之为什么C语言把数组形参当做指针:数组/指针实参

#include<stdio.h>
void print_array_test(char ca[])
{
        printf("ca : %s\n",ca);
        printf("&ca : %s\n",&ca);
        printf("&(ca[0]) : %s\n",&(ca[0]));
        printf("&(ca[1]) : %s\n",&(ca[1]));
        printf("*(ca+0) : %c\n",*(ca+0));
        printf("*(ca+1) : %c\n",*(ca+1));
        printf("ca+1 : %s\n",ca+1);
}

void print_ptr_test(char *pa)
{
        printf("pa : %s\n",pa);
        printf("&pa : %s\n",&pa);
        printf("&(pa[0]) : %s\n",&(pa[0]));
        printf("&(pa[1]) : %s\n",&(pa[1]));
        printf("pa+1 : %s\n",pa+1);
        printf("pa[1] : %c\n",pa[1]);
        printf("*(pa+1) : %c\n",*(pa+1));
        printf("++pa : %s\n",++pa);
}
int main()
{
        char abc[]="hello,world!";
        print_array_test(abc);
        print_ptr_test(abc);

        return 0;
}

数组abc[20]="hello,world!"

中&abc[i]与abc+i含义相同——取的是abc[i]的地址

指针pa =abc;

pa[i]与*(pa+i)是等价的——取的是abc[i]的值

鉴于以上程序,运行之:

[[email protected] code]# ./arrayandptr

ca : hello,world!

&ca : ???,??;

&(ca[0]) : hello,world!

&(ca[1]) : ello,world!

*(ca+0) : h

*(ca+1) : e

ca+1 : ello,world!

pa : hello,world!

&pa : ???,??;

&(pa[0]) : hello,world!

&(pa[1]) : ello,world!

pa+1 : ello,world!

pa[1] : e

*(pa+1) : e

++pa : ello,world!

[[email protected] code]#

C专家编程之为什么C语言把数组形参当做指针:数组/指针实参

时间: 2024-07-29 08:34:14

C专家编程之为什么C语言把数组形参当做指针:数组/指针实参的相关文章

《C专家编程》第四章——令人震惊的事实:数组和指针并不相同

数组和指针是C语言里相当重要的两部分内容,也是新手程序员最容易搞混的两个地方,本章我们锁定指针与数组,探讨它们的异同点. 首先来看指针与数组在声明上的区别: int a[10]; int *p; 很明显的,第一个是数组a,第二个是指针p.下一个问题是a的类型是什么?p的类型是什么?a[0]的类型是int,而a是个数组名,它是否表示整个数组呢?事实并非如此,a是一个指针常量,是一个指向int的指针常量,而p是一个指向int的指针,是一个变量.这是它们的第一个区别:一个是常量,一个是变量.那么常量和

C专家编程之为什么C语言把数组形參当做指针:数组/指针实參

#include<stdio.h> void print_array_test(char ca[]) { printf("ca : %s\n",ca); printf("&ca : %s\n",&ca); printf("&(ca[0]) : %s\n",&(ca[0])); printf("&(ca[1]) : %s\n",&(ca[1])); printf(&qu

C语言学习书籍推荐《C专家编程Expert C Programming Deep C Secrets》下载

Peter Van Der Linden (作者) <C和C++经典著作 C专家编程Expert C Programming Deep C Secrets>展示了C程序员所使用的编码技巧,并专门开辟了一章对C++的基础知识进行了介绍.书中C的历史.语言特性.声明.数组.指针.链接.运行时.内存以及如何进一步学习C++等问题进行了细致的讲解和深入的分析.全书撷取几十个实例进行讲解,对C程序员具有非常高的实用价值.<C和C++经典著作?C专家编程Expert C Programming De

《C专家编程》笔记(一)——C语言的历史、K&amp;R C和ANSI C

1. C语言的许多特性是为了方便编译器设计者而建立的.于是C语言的语言特性有:数组下标从0而非1开始:C语言的基本数据类型直接与底层硬件相对应:auto关键字只对创建符号表入口的编译器设计者有意义:表达式中的数组名可以看作是指针:float被自动扩展为double(ANSI C中不再如此):不允许嵌套函数(简化了编译器):register关键字,为编译器设计者提供线索,却把包袱丢给了程序员. 2. C编译器不曾实现的一些功能必须通过其他途径实现(编译器实现的功能,如加减乘除.指针.取地址).在C

《C专家编程》第三章——分析C语言的声明

前面一章我们已经说过C语言存在的一些问题和它晦涩的地方,让我们对这门神奇的语言有了更深的了解.现在这一章则集中精力来讨论C语言的声明,分为三块,首先是说明C语言声明晦涩难懂的原因和声明是如何形成的,其次就是学习怎样对C语言的声明进行分析,另外本文将详细来探讨一个分析C语言声明的工具--cdecl,分析和编写它的源代码. C语言的声明晦涩难懂这一点应该是名不虚传的,比如说下面这个声明: void (*signal(int sig, void(*func) (int)))(int); 这可不是吓人的

《C专家编程》笔记(三)——分析C语言的声明

1. 几个C语言声明的分析 char (*j)[20]; j = (char(*)[20]) malloc(20); // j是指向数组的指针 const int * grape; int const * grape; int * const grape_jelly; const int * const grape_jam; int const * const grape_jam; char * const * (*next)(); // next是指向函数的指针,这个函数不接收参数,它的返回值

C专家编程学习 1

1.C语言的基本数据类型直接与底层硬件相对应. 2#define 是可能出现问题 1 2 3 4 5 #define a(y) a_ex(y) a(x)被扩展为 a_ex(x) #define a (y) a_ex(y) a(x)被扩展为 (y) a_ex(y)(x) #define宏的用法 1.简单宏定义 1 #define a y 将文件中的 a 全部换成 y 为了避免出现问题,要将宏展开,根据运算符的优先级判断是否是需要的运算顺序. 2.带参数的宏定义 1 2 #define a(y) a

《C专家编程》:如何用气压计测量建筑物的高度(附3)

<C专家编程>,看完该书,这本书详细地介绍了C语言中的难点和易错点.本来后面的不打算写了,但是仔细想想,觉得应该善始善终,所以不论好坏,只要对自己有帮助就够了,就坚持写完!发现附录还有一个非常有趣的故事.在此也就以它结束吧,开拓一下我们眼界,更新我们的三观.   轻松一下--如何用气压计测量建筑物的高度 有一个很早的故事,讲的是一位物理系学生寻找新奇的方法用气压计测量一幢建筑物的高度.Alexander Calandrain The Teaching of Elementary Science

《C专家编程》数组和指针并不同--多维数组

<C专家编程>数组和指针并不同 标签(空格分隔): 程序设计论著笔记 1. 背景理解 1.1 区分定义与声明 p83 声明相当于普通声明:它所说明的并非自身,而是描述其他地方创建的对象,声明可以多次出现: 定义相当于特殊声明:它可以为对象分配内存,只能出现在一个地方. 1.2 数组和指针的访问方式 左值和右值 ???????? X = Y ; 符号X的含义是X所代表的地址,这被称为左值,左值在编译时可知,左值表示存储结果的地方. 符号Y的含义是Y所代表的地址的内容,这被称为右值,右值直到运行时