一、&*和*&还有**&的区别
首先"&"和 "*" 的运算优先级别是相同,都是按自右向左的方向结合。
&:取地址运算符,返回操作数所指的内存地址
*: 间接寻址运算符,返回操作数内存地址的值
*&:&返回操作数的内存地址,*&取操作数内存地址的值
因此,*&为操作数本身的值
&*:*相当于变量的值,然后再取变量的地址。
**&:**&的操作数只能为指针,&为指针自己的地址,*&为指针所指向的地址
因此,**&为指针所指向的地址的值
“&*p”先进行“ * ”运算," *p "相当于变量a;再进行" & "运算," &*p "就相当于取变量a的地址。
" *&a "先进行" & "运算," &a "就是取变量a的地址,然后执行" * "运算," *&a "就相当于取变量a所在地址的值,实际就是变量a。
#include <stdio.h>
#include <stdlib.h>
void main()
{
int a;
int *p;
p = &a;
scanf("%d", p);
printf("&*p = %d\n", &*p);
printf("*&a = %d\n", *&a);
printf("*&a = %d\n", **&a);
}
二、数组的初始化
(1) 定义数组后必须要初始化,不要认为不初始化,系统就会自动初始化为0;如果不初始化,局部变量在栈上,各数组元素的值将是随机数;
(2) 数组初始化:程序员至少必须把数组元素的第一个数组元素初始化为0,剩余的元素系统会自动初始化为0; 实际上,把数组初始化为0是在编译时完成的。
(3) 初始化值的个数可少于数组元素个数.当初始化值的个数少于数组元素个数时,前面的按序初始化相应值, 后面的初始化为0;
(4) 如果明确指定了数组大小,当在初始化时指定的元素个数超过这个大小就会产生错误. 例如:int array_test[3]={1,2,3,4} 超出了数组元素个数的界限;
(5) 当数组定义时没有指定大小,当初始化采用列表初始化了,那么数组的大小由初始化时列表元素个数决定。
(6) 一般来说 全局变量、静态变量处于数据区,默认初始化为0 (如果指定初始值,则为指定的值)局部数组根据编译器的特点有所不一样。
(7) 静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,在C中,初始化发生在代码执行之前,编译阶段分配好内存之后,
就会进行初始化.