指针就是地址。
指针就是地址。
指针就是地址。
时刻记住这句话,把指针当做地址来理解,理解的更快一些。
一:静态区(全局区)定义变量的时候初始化需要和定义在同一行。
问题:下边的程序分析:
#include<stdio.h>
int a=1,b=2;
int *i,*j;
i=&a;
j=&b;
void change(int *i,int *j)
{ int t;
t=*i;
*i=*j;
*j=t;
}
int main()
{
change(i,j);
printf("%d\n",a);
printf("%d\n",b);
return 0;
}
变量的缺省存储类型取决于它的声明位置。凡是在任何代码块之外声明的变量总是存储于静态内存中,也就是不属于堆栈的内存,这类变量称为静态变量。对于这类变量,你无法为它们指定其他存储类型。静态变量在程序运行之前创建,在程序的整个执行期间始终存在。它始终保持原先的值,除非给它赋一个不同的值或者程序结束。
显而易见int *p; 和*p两句代码都代表指针p为静态变量,编译器会给两个指针都分配静态内存,但是编译器不知道*p这句代码指向的数据是什么类型的,因此编译器在*p这句代码这里会提示missing storage-class or type specifiers,也就是缺失存储类型。
也就是说在静态区(全局区)定义变量的时候初始化需要和定义在同一行。 因为编译器可没这么聪明,另起一行了编译器就会根据你的代码判断你是要新建另外一个指针,但是这个指针却没有指向的对象数据类型。
修改后的代码:
#include<stdio.h>
int a=1,b=2;
int *i=&a,*j=&b;
void change(int *i,int *j)
{ int t;
t=*i;
*i=*j;
*j=t;
}
int main()
{
change(i,j);
printf("%d\n",a);
printf("%d\n",b);
return 0;
}
总结: 静态区(全局区)定义变量的时候初始化需要和定义在同一行。