在 C 言语中,变量的地址常常多是编译零碎主动分派的,对我们用户来说,我们是不晓得某个变量的详细地址的。所以我们界说一个指针变量 p,把通俗变量 a 的地址直接送给指针变量 p 就是 p = &a;如许的写法。
关于指针变量 p 的界说和初始化,普通有两种方法,这两种方法,初学者很轻易混杂,因而这个中央没其余办法,就是融会贯通,记住即可。
办法 1:界说时直接停止初始化赋值。
unsigned char a; unsigned char *p = &a;
办法 2:界说后再停止赋值。
unsigned char a; unsigned char *p; p = &a;
人人细心看会看出来这两种写法的差别,它们多是准确的。我们在界说的指针变量前边加了个*,这个*p 就代表了这个 p 是个指针变量,不是个通俗的变量,它是专门用来寄存变量地址的。此外,我们界说*p 的时分,用了 unsigned char 来界说,这里表现的是这个指针指向的变量类型是 unsigned char 型的。
指针变量似乎比拟好了解,人人也能很轻易就听明确。然则为什么许多人弄不明确指针呢?由于在 C 言语中,有一些运算和界说,他们是有差别的,许多同窗就是没弄明确它们的差别,指针就一直学欠好。这里我要重点强调两个差别,只需把这两个差别弄明确了,最少指针变量这局部就不是成绩了。这两个重点如今人人融会贯通,直接记住即可,靠了解有能够混杂概念。
第一个主要差别:指针变量 p 和通俗变量 a 的差别。
我们界说一个变量 a,同时也可以给变量 a 赋值 a = 1,也可以赋值 a = 2。
我们界说一个指针变量 p,别的还界说了一个通俗变量 a=1,通俗变量 b=2,那么这个指针变量可以指向 a 的地址,也可以指向 b 的地址,可以写成 p = &a,也可以写成 p = &b,但就是不克不及写成 p = 1 或许 p = 2 或许 p = a,这三种表达方法多是错的。
因而这个中央,不要看到界说*p 的时分前边有个 unsigned char 型,就毛病的赋值 p=1,这个只是阐明 p 指向的变量是这个 unsigned char 类型的,而 p 自身,是指针变量,弗成以给它赋值通俗的值或许变量,后边我们会直接把指针变量称之为指针,人人要留意一下这个小细节。
前边这个差别似乎比拟好了解,还有第二个主要差别,必定要记清晰。
第二个主要差别:界说指针变量*p 和取值运算*p 的差别。
“*”这个符号,在我们的 C 言语有三个用法,第一个用法很复杂,乘法操作就是用这个符号,这里就不讲了。
第二个用法,是界说指针变量的时分用的,比方 unsigned char *p,这个中央运用“*”代表的意思是 p 是一个指针变量,而非通俗的变量。
还有第三种用法,就是取值运算,和界说指针变量是完整两码事,比方:
unsigned char a = 1; unsigned char b = 2; unsigned char *p; p = &a; b = *p;
如许两步运算完了之后,b 的值就成了 1 了。在这段代码中,&a 表现取 a 这个变量的地址,把这个地址送给 p 之后,再用*p 运算表现的是取指针变量 p 指向的地址的变量的值,又把这个值送给了 b,最终的后果相当于 b=a。异样是*p,放在界说的地位就是界说指针变量,放在履行代码中就是取值运算。
这两个主要差别,人人可以重复浏览三四遍,把这两个主要差别弄明确,指针的大门就顺遂的踏出来一只脚了。至于具体的用法,我们后边用得多了就会渐渐熟习起来了。