一、指针相关符号的理解
我们写的代码是写给编译器看的,代码要达到目的,就必须编译器对代码的理解和我对代码的理解是一样的。编译器理解代码就是理解符号,我们只能正确理解符号才能想编译器一样思考。
(1)*号用法
1. *号在c语言中既可表示指针符号,也能表示乘号,但用法毫无关联。
2. *号在用于表明指针时有两种用法:第一种是指针定义时, *号结合前面的类型表明要定义的变量为指针及其类型;第二种是指针的解引用,解引用时星p表示 p指向的变量本身。
int mian(void)
{
int *p;// *与p相结合表明 此时定义的指针变量p为int类型。
int* p1;
int* p2;
int * p3;//四种不同定义指针的方式有什么不同吗?编译后发现四种定义指针的方式编译器认为是等价的.
//当我们定义两个指针变量时:
int *p4, *p5;//这样才是定义了两个指针变量。
int *p4, p5;//此时p4是指向int的指针而p5是int类型变量。
//为了避免定义多个指针变量出现歧义的情况采取第一种 int *p的定义方式。
}
int main(void)
{
int a=23;
int b=0;
int *p;//*的第一种用法
p=&a;
b=*p;//*的第二种用法
printf("b=%d.\n",b);
}
(2)&用法
取地址符使用时直接加在一个变量的前面,然后取地址符和变量加起来构成一个新的符号,这个符号表示这个变量的地址。
int mian(void)
{
int a;//&a表示变量a的地址。
int *p;
p=&a;//编译器一看到&a就知道我们要把a的地址赋值给指针p。
//变量a的地址由编译器分配只有编译器知道a的地址,
//所以我们没法直接把a的地址的数字赋值给p,只能用&来替代。
//理解&a,*p这种符号,关键在于要明白把前面的符号和后面的变量结合起来具有了一个新的意义。
//把当其作一个新的符号来理解。
}
二、指针定义并初始化、与指针定义然后初始化的区别
1. 指针定义时可以初始化,指针的初始化就是给指针变量赋初值(和普通变量的初始化没有任何本质区别)
2. 指针变量定义同时初始化的格式为: int a=32; int *p=&a;指针不初始化指针变量先定义再赋值:int a=32; int *p; p=&a;
三、左值与右值
1. 放在赋值运算符左边的是左值,放在右边的就是右值
2. 当一个值做左值时,编译器认为这个变量符号的真实含义是这个变量对应的内存空间;当一个变量做右值时,编译器认为这个变量符号的真实含义是这个变量的值,也就是这个这个变量对应内存空间中所存储的数。
int main(void)
{
int a=3,b=5;
a=b;//把b的值赋值到a所在的内存空间内。
//变量具有二意性。一层含义是这个变量对应的内存空间,另一层含义是变量内存空间所存储的那个数。
//当a做左值时我们关注的是其代表的内存空间,当a做右值时我们关心的是a内存中的那个数。
}