变量的指针 就是变量的地址。 我们可以定义一个指向 变量 的指针变量。
这种指针变量,我们在定义的时候,会引入一个*在定义的语句中,表示“这是一个指针变量”。
指针变量定义的一般形式:
类型标识符 *标识符 标识符:就是指针变量名字
int i,j ; //普通变量
float k; //普通变量
int *mypoint1,*mypoint2; //定义两个指针变量,这两个指针变量 指向整型变量的。
//指针变量定义时 变量名前面有个*,这个是和普通变量最明显的区别。
float *pm3; //指向实型变量的指针
float *pm4; //指向实型变量的指针
如何让一个整型指针变量 指向 一个整型变量,可以用赋值语句使一个整型指针变量 指向 一个整型变量(普通变量)。
mypoint1 = &i; //&地址符 等价于mypoint1指向了i
mypoint2 = &j; //等价于mypoint2指向了j
说明:
1.定义指针变量的时候,指针变量前是有“”的,表示这是正在定义一个指针变量,
但是,我用指针变量,指针变量名前是没有""的。多以,指针变量名是mypoint1,mypoint2,而不是*mypoint1,*mypoint2。
2.一个指针变量只能指向同一个类型的类型的变量(普通变量);
pm3 = &i; //编译错误
vs中 调试——窗口——内存 可查看内存地址。
牢记:指针变量中只存放地址。不要将一个整型变量赋值给一个指针变量;
mypoint = 4; //mypoint是一个指针变量,4是一个整数
和指针变量相关的运算符有两个:
(1)& :取地址符
(2)* :指针运算符(间接访问运算符),
2.1 乘法运算符 34
2.2定义指针变量的时候,我们用到,这个叫指针运算符;
但是,若这个不出现在指针定义的场合,而且也不是个乘法运算符,那么这个*依旧是指针运算符。只不过代表的是该指针变量所指向的变量。
int a,b;
int *p1,*p2; //*表示这两个变量是指针变量。
a =100;
b = 200;
p1 = &a; //把变量a的地址赋给了p1; ********现在p1指向了a;
p2 = &b; //把变量b的地址赋给了p2; ********现在p2指向了b;
printf("%d,%d\n",a,b); //*不用于指针定义的场合,代表的是它指向的变量
printf("%d,%d\n",*p1,*p2); //*p1 ===> a *p2 ====> b
解析:
1.
&*p1 : &是取址运算符,*是指针运算符。根据上表,这两个运算符优先级相同,但是他们运算符是自右向左结合的。
所以先看*p1,*p1代表的是p1所指向的变量,其实就是a,那么再执行&运算,其实 &*p1等价于&a;
又因为&a它本身就是p1,所以&*p1等于啥也没干。
p1= &*p1; // ==>&a
p2= &*p1; //==>指针变量p2指向了a
2. *&a : &是取址运算符,*是指针运算符。根据上表,这两个运算符优先级相同,但是他们运算符是自右向左结合的。
所以先看&a,也就是p1,再进行*运算,*&a ==>*p1,*p1代表的是p1指向的变量,也就是a,所以*&a ==> a。
3. (*p1)++ : *p1是a,所以(*p1++)是a++
(*p1)++;
a;
*p1++ : 因为 ++和*同级,又是从右到左结合。所以 *p1++ 等价于*(p1++)
p1++
地址是个数字,地址加1的意思如下:
如果普通整型变量i,i++,i =4;则i = 5;就是i这个变量对应的内存中的内容+1;
同理,指针变量自+1,也肯定是这个指针变量中的内容要自加,但是这种本来是自加1的操作,对于指针来讲就不一定是自加1;自加几,取决于该指针变量所指向的变量类型,如果p1指向的是整型变量,那么p1++的内容要加4;因为int是4个字节。
p1++意味着p1指向i之后的变量,要完整跳过4个字节,所以p1++后内容如下
*(p1)++ 不再指向a,他就指向a后边的内存,这段内存不知道是谁的,所以 *(p1)++ 这个动作非常危险,因为你会改变不属于你的内存;
p1;
p1++;
*p1 = 45; //极度危险,留下隐患,因为这段内存0x0024F9A8不属于你,你却把这段内存中的值覆盖了。
int *pmax,*pmin,*p,a,b; //pmax指向大的值,pmin指向小的值
a = 5;
b =8;
pmax = &a;
pmin = &b;
if(a < b)
{
//为了演示指针变量的赋值,
p = pmax;
pmax = pmin; //现在P指向a(指向了大的值)
pmin = p; //pmin指向a(指向了小的值)
}
printf("a = %d,b = %d\n",a,b);
printf("max = %d,min = %d\n",*max,*min);