一、运算符&
1.&运算符可以获得变量的地址,它的操作数必须是变量
int i;
printf("%x",&i);
2.地址的大小是否与int相同取决于编译器
int i;
printf("%p",&i);//%p以32进制输出i的地址
二、指针变量
指针变量是保存地址的变量,指针里面保存的是其他变量的地址。
普通变量的值是实际的值,但指针变量的值是具有实际值的变量的地址。
int i;//定义变量i
int* p = &i;//定义指针p,指向int类型的i(指针p指向i)。 即将i的地址赋值给指针p!!!
int *p = &i;//定义指针时int* p或int *p都可以,“*”的位置不影响
int* p,q;
int *p,q;//这两个都是只有变量p是指针,而变量q不是
int *p,*q;//这才表示变量p和q都是指针
三、指针的使用
定义一个f函数,f要的是int 的指针p
void f(int *p);
在函数f被调用时得到的是某个变量的地址:
int i=0; f(&i);//这里得到的就是i的地址
访问那个地址上的变量“*”
“*”是一个单目运算符,用来访问指针的值所表示的地址上的变量,可以做右值也可以做左值。
#include<stdio.h>
void f(int *p);
void g(int k);
int main(void)
{
int i=6;
printf("&i=%p\n", &i);
f(&i);
g(i);
return 0;
}
void f(int *p)
{
printf(" p=%p\n", p);//这里的p是一个指针
printf("*p=%d\n",*p);//这里的*p连在一起可以看做是一个整数
}
void g(int k)
{
printf("k=%d\n",k);
}
使用指针修改指针所指变量的值,代码如下:
#include<stdio.h>
void f(int *p);
void g(int k);
int main(void)
{
int i=6;
printf("&i=%p\n", &i);
f(&i);
g(i);
return 0;
}
void f(int *p)
{
printf(" p=%p\n", p);//这里的p是一个指针
printf("*p=%d\n",*p);//这里的*p连在一起可以看做是一个整数
*p = 26;
}
void g(int k)
{
printf("k=%d\n",k);
}
这里的k=26意味着经过函数f调用之后main函数中i的值被改了,此时指针p可以直接访问变量i,那么p就相当于i。所以p=26实际上是直接修改了i的值。
左值为什么叫左值