数组与指针不能混用的情况
1 关于指针与数组能不能混用的说明
1)这种情况不能混用
C语言中不管是变量还是函数,定义只能出现一次,声明可以进行多次。
就是因为声明可以进行多次,所以不同的声明就引发了一些问题。
① 数组定义不能等同于指针的外部声明。
int array[];
你知道下面两种声明的区别吗?
extern int *array;extern int array[];
它们的区别:
第一条语句声明的array是个int型的指针,它的大小是一个int型的大小。
第二条语句声明的array是个int型数组,长度尚未确定(不完整的类型),其存储在别处定义。
② 变量名相同,类型不同。
extern float array[];// 与上面定义的int array[]类型不匹配直接编译不过
2)这种情况下可以混用
作为函数参数的数组名等同与指针,即下面三种形式是可以混用的。
func(int *var)func(int var[])func(int var[128])
2 实例代码
下面就一个C文件定义,另一C文件声明的几种情况进行一下实例代码的探究。
1)指针与数值没有混用的情况
说在代码注释中了,
。
/* file2.h */
#include <stdio.h>
#include <stdlib.h>
int array[]; // 声明一下file2.c中对应的数组
/* file2.c */
#include <stdio.h>
#include <stdlib.h>
#include 'file2.h' // 在对应的头文件进行声明
int array[128] = {1,2,3,4,5}; // 在此处定义数组
/* file1.c */
#include <stdio.h>
#include <stdlib.h>
#include 'file2.h'
extern int array[]; // 此种声明是能与int array[]对应上的
int main(int argc, char *argv[])
{
printf('\n%d\n',array[1]);// 可以得到数据2
return 0;
}
运行结果:
2)定义数组,声明指针
直接编译不过。
/* file2.h */#include <stdio.h>#include <stdlib.h>
int array[]; // 声明一下file2.c中对应的数组int array[128]
/* file2.c */
#include <stdio.h>#include <stdlib.h>#include 'file2.h' // 在对应的头文件进行声明
int array[128] = {1,2,3,4,5}; // 在此处定义数组
/* file1.c */
#include <stdio.h>#include <stdlib.h>#include 'file2.h'
extern *array; // 此种声明是与int array[]对应不上的,编译直接报错
int main(int argc, char *argv[]) {
printf('%d',array[1]);
return 0;}
编译结果:
3)声明时指针不匹配
直接编译不过。
/* file2.h */
#include <stdio.h>
#include <stdlib.h>
int array[]; // 声明一下file2.c中对应的数组int array[128]
/* file2.c */
#include <stdio.h>
#include <stdlib.h>
#include 'file2.h' // 在对应的头文件进行声明
int array[128] = {1,2,3,4,5}; // 在此处定义数组
/* file1.c */
#include <stdio.h>
#include <stdlib.h>
#include 'file2.h'
extern float array[]; // 此种声明float与int类型不对应,直接编译报错
int main(int argc, char *argv[])
{
printf('%f',array[1]);
return 0;
}
运行结果:
4)定义成指针以数组引用
没有什么问题,可以正常使用。
/* file2.h */
#include <stdio.h>#include <stdlib.h>
char *array; // 声明一下file2.c中对应的数组char *array
/* file2.c */
#include <stdio.h>#include <stdlib.h>#include 'file2.h' // 在对应的头文件进行声明
char *array = 'abcdefg'; // 在此处定义数组
/* file1.c */
#include <stdio.h>#include <stdlib.h>#include 'file2.h'
extern char *array; // 此种声明是与char *array是一样的
int main(int argc, char *argv[]) { printf('\n%c\n',array[1]); // 指针以数组的方式使用
return 0;}
运行结果: