指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。
计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节,char 占用 1 个字节。
为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。
C语言用变量来存储数据,用函数来定义一段可以重复使用的代码,它们最终都要放到内存中才能供 CPU 使用。数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是数据还是代码。
当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据。
CPU 只能通过地址来取得内存中的代码和数据,程序在执行过程中会告知 CPU 要执行的代码以及要读写的数据的地址。
如果程序不小心出错,或者开发者有意为之,在 CPU 要写入数据时给它一个代码区域的地址,就会发生内存访问错误。这种内存访问错误会被硬件和操作系统拦截,强制程序崩溃,程序员没有挽救的机会。
变量名和函数名为我们提供了方便,让我们在编写代码的过程中可以使用易于阅读和理解的英文字符串,不用直接面对二进制地址,那场景简直让人崩溃。
需要注意的是,虽然变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符,但在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址。
扩展资料
指针使用(* 和 &)
*&a可以理解为*(&a),&a表示取变量 a 的地址(等价于 pa),*(&a)表示取这个地址上的数据(等价于 *pa),绕来绕去,又回到了原点,*&a仍然等价于 a。
&*pa可以理解为&(*pa),*pa表示取得 pa 指向的数据(等价于 a),&(*pa)表示数据的地址(等价于 &a),所以&*pa等价于 pa。
对星号*的总结
在我们目前所学到的语法中,星号*主要有三种用途:
1、表示乘法,例如int a = 3, b = 5, c c = a * b,这是最容易理解的。
2、表示定义一个指针变量,以和普通变量区分开,例如int a = 100 int *p = &a。
3、表示获取指针指向的数据,是一种间接操作,例如int a, b, *p = &a *p = 100 b = *p。
1、使用场景
使用指针时,必须将它指向一个变量的地址或者为它分配空间方能使用,如下所示:
#include<stdio.h>
#include<stdlib.h>
intmain(intargc,charconst*argv[])
{
inta[5]={0,1,2,3,4}
int*b,*d
intc=2
int*e=a//e指向a数组首地址
//*b=2 无法直接初始化
//printf("%d\n",*b)
e=e+2 //移动两个地址单元
d=&c //d指向c的地址来表示值
c=4 //修改原c变量的值,d指针的值会发生改变
b=(int*)malloc(sizeof(int))//为b分配一个int型空间来直接存储值
*b=2//分配空间后可以直接赋值了
printf("thisise,b,c,d:%d%d%d%d\n",*e,*b,c,*d)
2、类型说明
(1)int*a:表示一个指向int型变量的指针,指向的是变量的地址单元
(2)char*b:表示一个指向char变量的指针
*a表示的是这个指针指向地址的值,a为此指针本身的地址,这点要明确,一般用*(a+1)、*(a+2)来表示值,如:
intnums[5]={0,1,2,3,4}
int*a=nums
printf("%d%d%p\n",*a,*(a+1),a)
扩展资料:指针的运算
指针指向变量地址,若原变量的内容发生了变化,它本身也会发生变化,指针之间的运算一般为值运算和地址运算
(1)值运算:直接通过*运算方式,像a+*(a+1),结果为第一个元素与第二个元素相加。
intnums[5]={0,1,2,3,4}
int*a=nums
(2)地址运算:通过a+i的方式.指针会指向a的下i个地址。
intnums[5]={0,1,2,3,4}
int*a=nums
a=a+2
printf("%d\n",*a)
结果输出2。
参考资料来源:指针-百度百科1、c语言指针其实是一个整形变量,与其它数据不同的是,它的作用是用来存储其它变量的地址。指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。
2、因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
3、再打个比方:有个人让你去麦当劳帮我买个雪糕,那么麦当劳是这个变量a,但是那个人现在把麦当劳所在的地址写在纸上给你,那么这张纸就可以看做一个指向麦当劳的指针。