您的位置:首页 > 编程语言 > C语言/C++

理解C语言 第25课 指针数组与数组指针的分析

2014-09-20 21:39 260 查看
下面这些声明合法吗?

int array[5];

int matrix[3][3];

int *pA = array;/*pA是指针,但不是数组指针,它是指向int类型数据的指针,array不是数组地址,而是数组首元素的地址*/

int *pM = matrix;

问题:

array代表数组首元素的地址,那么matrix代表什么?

array和&array的地址值相同,但是意义不同,那么指向它们的

指针类型相同吗?

数组类型

工作中的对话。。。

A:这里定义的数组什么类型的?

B:int型。。。(错误的说法)

C语言中的数组有自己特定的类型

数组的类型由元素类型和数组大小共同决定

例:int array[5]的类型为int[5]

重命名数组类型

C语言中通过typedef为数组类型重命名

typedef type(name)[size];

type为数组元素的类型。

数组类型:

typedef int(AINT5)[5];

typedef float(AFLOAT10)[10];

数组定义:

AINT5 iArray;

数组指针

数组指针是一个指针,它指向一个数组

数组名是数组首元素的起始地址,但并不是数组的起始地址

通过将取地址符&作用于数组名可以得到数组的起始地址

可通过数组类型定义数组指针: ArrayType* pointer;

也可以直接定义:type (*pointer)
;(不推荐)

pointer为数组指针变量名

type为指向的数组元素的类型

n为指向的数组的大小

AFLOAT10 fArray;

实例分析

数组类型的定义

数组指针的使用

数组指针运算

#include <stdio.h>

typedef int(AINT5)[5];

typedef float(AFLOAT10)[10];

typedef char(ACHAR9)[9];

int main()

{

AINT5 a1;

float fArray[10];

AFLOAT10* pf = &fArray;

ACHAR9 cArray;

char(*pc)[9] = &cArray;

char(*pcw)[4] = cArray;//错误,类型不一致。不一致表现在两个方面

//1.cArray是数组首元素的地址,而不是数组地址;

//2.即便改成&cArray,数组cArray的类型是char[9],而指针的类型是char[4],类型不一致。

//在C语言中,赋值符号"="两边的数据类型必须是相同的,如果不相同需要进行显示或隐式的类型转换

int i = 0;

printf("%d, %d\n", sizeof(AINT5), sizeof(a1));

for(i=0; i<10; i++)

{

(*pf)[i] = i;//注意此处(*pf)[i]与fArray[i]的关系

}

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),pc+1指向整个数组后面,

//*pc指向char[9]类型数组,所以sizeof(*pc)表示pc所指向的整个数组大小

}

指针数组

指针数组是一个普通的数组

指针数组中每个元素为一个指针

指针数组的定义:type* pArray
;注:[]的优先级比*要高

type*为数组中每个元素的类型

pArray为数组名

n为数组大小

实例分析:关键字查找(复习好,字符数组)

#include <stdio.h>

#include <string.h>

int lookup_keyword(const char* key, const char* table[], const int size)/*size代表table数组的大小*/

{

int ret = -1;

int i = 0;

for(i=0; i<size; i++)

{

if( strcmp(key, table[i]) == 0 )

{

ret = i;

break;

}

}

return ret;

}

#define DIM(a) (sizeof(a)/sizeof(*a))

int main()

{

const char* keyword[] = {

"do",

"for",

"if",

"register",

"return",

"switch",

"while",

"case",

"static"

};

printf("%d\n", lookup_keyword("return", keyword, DIM(keyword)));

printf("%d\n", lookup_keyword("main", keyword, DIM(keyword)));

}

main函数的参数

int main()

int main(int argc)

int main(int argc, char *argv[])

int main(int argc, char *argv[], char *env[])

argc – 命令行参数个数

argv – 指向命令行参数的各指针构成的数组

env – 指向环境变量的各指针构成的数组

main函数可以理解为操作系统调用的函数

在执行程序的时候可以向main函数传递参数

实例分析:命令行参数的使用

#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("\n");

printf("\n");

printf("\n");

printf("============== Begin env ==============\n");

for(i=0; env[i]!=NULL; i++)

{

printf("%s\n", env[i]);

}

printf("============== End env ==============\n");

}

小结

数组指针本质上是一个指针

数组指针指向的值是数组的地址

指针数组本质上是一个数组

指针数组中每个元素的类型是指针

注意:int *p1[10];与int (*p1)[10];的区别
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: