//导入输入输出库
#include<stdio.h>
/*
第十章 数组和指针
关键字
数组 array 由一系列类型相同的元系构成。可以使用声明来告诉编译器需要一个数组
数组声明(array declaration)中包括数组元素的数目和元素的类型。
指针
指针提供了一种用来使用地址的符号方法。由于计算机的硬件指令很大程序上要依赖于地址,
所以指针使您能够以类似于计算机底层的表达方式来表达自己的意愿。这使得使用了指针的程序能够更高效的工作。
数组标记实际上是一种变相使用指针的形式
flizny == &flizny[0]//数组名是该数组首元素的地址
flizny 和 &flizny[0]都 代表首元系的内存地址
指针说明符%p通常以十六进制形式显示值
处理二维数组的函数有一处可能不太容易想通,数组的行可以在函数调用时传递,但是数组的列却只能被预置在函数内部
void sum_rows(int ar[][COLS], int rows);
void sum_cols(int[][COLS], int);//可以省略名称
int sum2d(int(*ar)[COLS], int rows);//另一种语法形式
创建一个处理任意二维数组的函数,也是有可能的,但是比较繁琐
(因为这样的函数需要把数组当作一维数组传递,然后由函数计算每行的起始地址)
C99标准引入了变长数组,它允许使用变量定义数组各维
int quarters=4;
int regions = 5;
double sales[regions][quarters];// 一个变长数组 VLA
变量数组并不是说可以修改其大小,而是在创建时可以用变量来指定,在创建后就不变了
C99规琮,可以省略函数原型中的名称,但是如果省略名称,则需要星号来代替省略的维数
int sum2d(int,int,int ar[*][*])
复合文字
假设需要向带有一个int参量的函数传递一个值,您可以传递一个int变量,也可以传递一个int常量,比如5
在C99标准出现之前,数组参数的情况是不同的;可以传递数组,但没有所谓的数组常量可供传递。
C99新增了复合文字(compound literal).
文字是非符号常量。
例如5是int类型的文字,81.3是double类型的文字,'Y'是char类型的文字,'elephant'是字符串文字。
开发C99标准的委员会认为,如果有能够表示数组和结构内容的复合文字,那么会更方便
(int [2]){10,20}//一个复合文字,创建了一个包含两个int值的无名称数组 类型名就是int[2] 只是没名称
正如初始化一个合名数组时可以省略数组大小一样,初始化一个复合文字时也可以省略数组大小,编译器会自动计算元素的数目。
由于这些复合文字没有名筄,因此不可能在一个语句中创建它们,然后在另一个语句中使用。而是必须在创建它们的同时过某种方法来使用它们,
一种方法是使用指针保存其位置
int *pt1;
pt1 = (int[2]){10,20};
文字常量和数组名相同,这个常量同时代表首元素的地址,因此可以用它给一个指向int的指针赋值。
*pt1 = 10, pt1[1]20;
int (*pt2)[4] //声明一个指向4个 int的数组的数组指针
pt2 = (int[2][4]){{1,2,3,-9},{4,5,6,-8}}
*/ |
|