**关于C语言指针变量做一些总结**
1、指针变量和普通变量
指针变量和普通变量的区别:指针变量存放的是某一个变量的地址,而普通变量存放的是值。
下面通过简单举例详细说明
unsigned int a; //定义普通变量a
unsigned int *p; //定义指针变量p
void main(void)
{
a = 5; //给变量a赋值 5
p = &a; //取a的地址,将a的地址赋值给p
}
上面的代码分析,假设变量a的地址是0x0023,指针变量p的地址是0x0078,主函数第一句将变量a赋值5,也就是a存放的数据是5,第二句是将a的地址赋值给了指针变量p,那么p存放的值是a的地址即0x0023,p自身的地址没有改变,如下图所示。
我们继续用上面的函数看看如何运用指针变量。
unsigned int a; //定义普通变量a
unsigned int *p; //定义指针变量p
unsigned int **pt; //定义二级指针变量pt
void main(void)
{
a = 5; //给变量a赋值 5
p = &a; //取a的地址,将a的地址赋值给p
*p = 7; //此时a的值变为7
pt = &p; //用指针的指针pt存放指针p的地址
}
主函数第3句*p=7执行完后,指针p自身的地址没有改变,指针p存放的值即a的地址也没有改变,改变的是指针变量p指向的内容,即a的值。所以a的值变成7。
第4句是指针变量p本身的地址赋值给二级指针pt,pt是指针的指针,所以存放的是指针的地址。
用单片机仿真调试结果如下
注意点总结:
1、p是指针变量,存放的是地址(内存单元的编号)。不能给指针变量赋数据值,如p = 100,这是错误的,无法通过编译;只能赋地址值,如p = &a;
2、*p表示的是数据值,即p指针指向地址的内容。不能给*p赋地址值,如*p = &a; 这是错误的,无法通过编译;*p表示的是数据值,所以只能赋数据值。如*p = 100;或将地址值 &a 强转成数据值,如*p = (uint8_t)&a;
3、定义指针变量时的*和使用指针变量时的&意义不同。指针定义中的*
,表示定义一个指针变量。(如int *p;表示定义一个int类型的指针变量)使用指针变量时的*
,表示取值运算符。(如*p,表示获取指针变量p指向地址的内容)
4、*p 和 &p的区别:* 取值运算符(即取地址对应的值);& 取地址运算符(取变量的地址)
2、指针变量和数组
数组名就是该数组的首地址,也是数组第一个元素的地址
用指针加1来对应改变a[1]的值
用来传递参数,实现将数组b的值传递到数组c
int b[5]={2,3,4,5,6};
int c[5];
void fun(int *a)
{
int i;
for(i=0;i<5;i++)
{
c[i] = *(a+i);
}
}
int main(void)
{
fun(b);
}
通过了解清楚c语言指针变量可以对后面了解函数指针,指针函数等有所帮助