单片机技术网|技术阅读
登录|注册

您现在的位置是:单片机技术网 > 技术阅读 > 数组与指针不能混用的情况

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

推荐关注????下方公众号学习更多嵌入式知识!✎ 编 者 悟 语

    

      正当性的出发点应该是少目的性、不带偏见、以尊重为前提的多方考虑



文 章 导 读


    C中的数组有能混用的情况,有不能混用的情况,今天就带小伙伴们探究一下!

    阅读过程中有什么问题可以后台交流哈,


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


    运行结果:




深度剖析C语言的main函数
嵌入式工程师常用的宏定义
几条很接地气的PCB设计指南

点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看