c语言指针变量详解

**关于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自身的地址没有改变,如下图所示。

c语言指针变量详解_第1张图片

 我们继续用上面的函数看看如何运用指针变量。

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是指针的指针,所以存放的是指针的地址。

用单片机仿真调试结果如下

c语言指针变量详解_第2张图片

注意点总结:

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、指针变量和数组

数组名就是该数组的首地址,也是数组第一个元素的地址

c语言指针变量详解_第3张图片

用指针加1来对应改变a[1]的值

c语言指针变量详解_第4张图片

 用来传递参数,实现将数组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语言指针变量可以对后面了解函数指针,指针函数等有所帮助

你可能感兴趣的:(#,单片机软件学习班-Beta课堂,c语言,c++,开发语言)