C语言--定义为数组,声明为指针&定义为指针,声明为数组
2018-01-04 10:18
357 查看
1.定义为数组,声明为指针
文件1中定义如下:
char a[100]="abcdef";
文件2中声明如下:
extern char* a;
这个时候编译器在编译的时候是分别编译的,在编译文件1时知道a是大小为100byte的数组,但是在编译文件2的时候,会认为a是char*的指针,大小为4
重点:在编译文件2的时候由于extern声明,编译器此时认为a是在其他文件中定义为了指针,此时就相当于在文件2看到的定义是char *a=abcd,这是因为指针大小是4,然后文件1中数组a[100]中存储的内容是前4个字节abcd,且此时编译器在编译文件2时认为文件1中的a是指针类型,而此时这个指针变量存储的内容是abcd。
因此这个时候文件2中的a中的值就是abcd,在取值*a的时候就是在地址值为abcd上的值,这个时候就会引出BUG,因此在声明与定义的时候要保证声明与定义的时候保持一致
避免这个问题需要清晰如下几个点:
a.有些编译器,在编译多个文件的时候是分开编译的,编译文件2的时候,文件2认为a的定义也是指针,而此时文件1中实际定义是数组,他的内存上已经存储了abcdef,文件2此时就误以为此时的地址值是abcd
b.数组char a[100]="abcdef",a拥有100个char类型的数组,其空间是100,数组a本身在栈上面,对a的元素的访问必须根据数组名a找到数组首元素的首地址,然后根据偏移量找到相应的值,“abcdef”就存储在以a为首元素首地址的内存当中
c.char* a,a本身在栈空间上占4个字节,a里面存储的是一块内存的首地址。这块内存在静态区
切记:数组与指针是有区别的
2.定义为指针,声明为数组
文件1中定义如下:
char *a="abcdef";
文件2中声明如下:
extern char a[100];
原理同上,此时在编译文件2的时候 认为定义的地方也是数组,而此时定义的地方确实指针,这个指针a的值为“abcdef”的首地址,大小为4字节,所以此时文件2中数组a中的元素值就是“abcdef”的首地址,且只有4个元素有值
文件1中定义如下:
char a[100]="abcdef";
文件2中声明如下:
extern char* a;
这个时候编译器在编译的时候是分别编译的,在编译文件1时知道a是大小为100byte的数组,但是在编译文件2的时候,会认为a是char*的指针,大小为4
重点:在编译文件2的时候由于extern声明,编译器此时认为a是在其他文件中定义为了指针,此时就相当于在文件2看到的定义是char *a=abcd,这是因为指针大小是4,然后文件1中数组a[100]中存储的内容是前4个字节abcd,且此时编译器在编译文件2时认为文件1中的a是指针类型,而此时这个指针变量存储的内容是abcd。
因此这个时候文件2中的a中的值就是abcd,在取值*a的时候就是在地址值为abcd上的值,这个时候就会引出BUG,因此在声明与定义的时候要保证声明与定义的时候保持一致
避免这个问题需要清晰如下几个点:
a.有些编译器,在编译多个文件的时候是分开编译的,编译文件2的时候,文件2认为a的定义也是指针,而此时文件1中实际定义是数组,他的内存上已经存储了abcdef,文件2此时就误以为此时的地址值是abcd
b.数组char a[100]="abcdef",a拥有100个char类型的数组,其空间是100,数组a本身在栈上面,对a的元素的访问必须根据数组名a找到数组首元素的首地址,然后根据偏移量找到相应的值,“abcdef”就存储在以a为首元素首地址的内存当中
c.char* a,a本身在栈空间上占4个字节,a里面存储的是一块内存的首地址。这块内存在静态区
切记:数组与指针是有区别的
2.定义为指针,声明为数组
文件1中定义如下:
char *a="abcdef";
文件2中声明如下:
extern char a[100];
原理同上,此时在编译文件2的时候 认为定义的地方也是数组,而此时定义的地方确实指针,这个指针a的值为“abcdef”的首地址,大小为4字节,所以此时文件2中数组a中的元素值就是“abcdef”的首地址,且只有4个元素有值
相关文章推荐
- const int *a, int const *a,int * const a,区别,指针数组,数组指针,声明与定义
- c语言复杂变量声明(数组、指针、函数)
- 程序猿之--C语言细节13(二维数组和指针,&*a[i][0]的理解,数组1[e]和e[1]很可能你没见过)
- 数组&指针&函数(转自C语言习题与解析 第3版 李春葆编著)
- C语言——定义&&声明
- 定义为数组,声明为指针
- C指针和数组:定义为字符串指针,声明为字符数组的后果
- const int *a, int const *a,int * const a,区别,指针数组,数组指针,声明与定义
- [原创]C/C++中复杂指针声明&&数组名的一点小事
- 指针与数组--指针与数组的定义与声明
- C语言中,即使参数声明为数组,它仍然是个指针
- C语言——定义&&声明
- 程序员之---C语言细节12(指针和数组细节,"//"的可移植性说明)
- C语言笔记->通过指针引用数组
- 7、数组1---(定义、a,&a,&a[0]区别、以指针形式访问和以下标形式访问)(
- C语言,结构体中字符串的声明(采用字符指针还是字符数组)
- 解读C语言中函数指针数组构成的复杂定义
- C语言学习笔记(6)-如何从变量声明的表面上来区分指针数组和数组指针
- C语言 字符数组和字符串指针的理解
- const int *a, int const *a,int * const a,区别,指针数组,数组指针,声明与定义