int指的是数组元素的类型,而不是数组的类型
定义数组类型
C语言中通过typedef为数组类型重命名
typedef type(name)[size];
数组类型:
typedef int(AINT5)[5];
typedef float(AFLOAT10)[10];
数组定义:
AINT5 iArray; //AINT5代表一个数组类型,这个数组有5个元素,每个元素类型是int型
AFLOAT10 fArray; //AFLOAT10代表一个数组类型,这个数组有10个元素,每个元素类型是float型
数组指针
首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。
数组名是数组手元素的起始地址,但并不是数组的起始地址
通过将取地址符&作用域数组名可以得到数组的起始地址
可通过数组类型定义数组指针:ArrayType* pointer
也可直接定义:type(*pointer)[n];
.pointer为数组指针变量名
.type为指向的数组的类型
.n为指向的数字的大小
int (*p2)[10];
()的优先级比[]高,*号和p2 构成一个指针的定义,指针变量名为p2 ,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针,如下图
例1:
typedef int(AINT5)[5];
typedef float(AFLOAT10)[10];
typedef char(ACHAR9)[9];
int main()
{
AINT5 a1;
float fArray[10];
AFLOAT10* pf = &fArray; //&fArray取到数组地址赋给pf,所以pf是数组指针
ACHAR9 cArray;
char(*pc)[9] = &cArray; //pc是数组指针,指向char[9]类型的数组,这个数组有9个元素,每个元素是char类型
char(*pcw)[4] = cArray; //赋值号左边是一个数组指针,右边是一个char[9]类型的数组名,其代表数组首元素地址,类型是char*,两边类型不一样,编译会提示警告
int i = 0;
printf("%d, %d\n", sizeof(AINT5), sizeof(a1)); //结果都是20
for(i=0; i<10; i++)
{
(*pf)[i] = i; // (*pf) <=> (*&fArray) <=> fArray,所以这一句是给fArray[10]赋值
}
for(i=0; i<10; i++)
{
printf("%f\n", fArray[i]);
}
printf("%0X, %0X, %0X\n", &cArray, pc+1, pcw+1);
// pc+1 <=> (unsigned int)pc + 1*sizeof(*pc),指向这个数组9个元素后面
// pcw+1 <=> (unsigned int)pcw + 1*sizeof(*pcw),虽然赋值是个char*,但指向这个数组4个元素后面
}
指针数组
首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称
指针数组是一个普通的数组
指针数组中每个元素为一个指针
数组指针的定义:type* aArray[n];
type* 为数组中每个元素的类型
pArray为数组名
n为数组大小
int* p1[10];
[]的优先级比*要高。p1 先与[]结合,构成一个数组的定义,数组名为p1 ,int *修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含10 个指向int 类型数据的指针,即指针数组,如下图
例2:
const char* keyword[] = {
"do",
"for",
"if",
"register",
"return",
"switch",
"while",
"case",
"static"
}; //keyword[]数组中每个元素都是char*类型的字符指针
main函数的参数
main函数可以理解为操作系统调用的函数
在执行程序的时候可以想main函数传递参数
例3:
#include <stdio.h>
int main(int argc, char* argv[])
{
int i = 0;
printf("============== Begin argv ==============\n");
for(i=0; i<argc; i++)
{
printf("%s\n", argv[i]);
}
printf("============== End argv ==============\n");
}
在cmd下运行得
例4:
例3:
#include <stdio.h>
int main(int argc, char* argv[], char* env[])
{
int i = 0;
printf("============== Begin argv ==============\n");
for(i=0; i<argc; i++)
{
printf("%s\n", argv[i]);
}
printf("============== End argv ==============\n");
printf("============== Begin env ==============\n");
for(i=0; env[i]!=NULL; i++)
{
printf("%s\n", env[i]); //打印系统环境变量
}
printf("============== End env ==============\n");
}