数组与指针不能混用的情况

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;}

运行结果:

(0)

相关推荐