c语言指针

2020-03-30  本文已影响0人  温岭夹糕

参考c语言中文网:http://c.biancheng.net/view/1990.html

计算机中所有的数据都必须放在内存中,不同类型的数据占用字节数不同,为了正确地访问或找到这些数据,必须为每个字节都编上号码(采用16进制),每个字节的编号都是唯一的,像身份证一样

我们将内存中字节的编号称为地址或指针

数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。

以%#X或%p形式来输出&变量的地址。

C语言用变量来存储数据用函数来定义一段可以重复使用的代码,它们最终都要放到内存中才能供 CPU 使用

变量->数据

函数->代码

指针 == 16进制编号

数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是数据还是代码。当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据

CPU 只能通过地址来取得内存中的代码和数据,程序在执行过程中会告知 CPU 要执行的代码以及要读写的数据的地址。

CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。

*称为指针运算符,既用来定义一个指针变量(用来区分普通变量)也用来取得某个地址上的数据(取值)

int a=100; // a的地址为0x1000

int *p=&a; // p的值为0x1000,此时为定义

printf("%d\n",*p);

 //表示对该地址取值 即 *p == a 为true


关于指针(编号)的加减

对地址的加减涉及到定义指针变量时的变量类型

int a=100 ,*p = &a;

printf("%p\n",p); //地址为0x1000

p++;  //  p++  != *p++

printf("%p\n",p); //地址为0x1004

因为int占4个字节,对整型变量指针+1就为跳过4个字节


数组的特殊性

数组在内存中一块连续的内存,数组名就是指针?

(数组等价于指针,这是不完全正确的,但大多数情况下可以这样认为)

它指向数组的第0个元素

int a[] = {1,2,3}

printf("%p  %p\n",a,&a[0])

注: int  *p = a ;等价于 int *p = &a[0]

借由这个特性我们可以推导出对数组名+1就是让指针向后移动一位

printf("%d\n",*(a+1)); // *表示对地址取值,此时为a[1]

上一篇下一篇

猜你喜欢

热点阅读