理解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];的区别
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];的区别
相关文章推荐
- 数组与指针典型面试题分析--深入理解指针含义
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- 从编译器角度分析C语言中数组名和指针的区别
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言中数组与指针的透彻分析
- C语言中字符数组和字符串指针分析
- 转载加自己的见解 之从编译器角度分析C语言中数组名和指针的区别
- C语言中字符数组和字符串指针分析
- C语言数组与指针定义分析
- C语言 数组与指针的理解
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析(转载)
- C语言 数组与指针的理解
- C语言中字符数组和字符串指针分析
- 深入理解C语言中的指针与数组之指针篇
- 【笔试面试知识点查缺补漏深入理解之C与C++篇】C语言中的指针数组与数组指针
- C语言中字符数组和字符串指针分析
- 理解C语言指针和数组的关系的代码