稍谈 C/C++ 数组与指针 (以及内存)

我加的技术交流微信群中 , 不少人搞不清数组与指针的关系, 对指针感觉很困惑. 会用指针, 但是又感觉隔着一层纱, 摸不着本质.

所以这里说一说吧,

先从内存谈起..  内存 memory. 和大神交流时, 对方说, "你查看一下 mem 的内容", 你别搞不清大神的意思, 大神说的 mem 是 memory , 就是指内存..  这种基本的术语要记下来的, 好不废话, 进入正题.

内存:
内存指计算机内部储存器, 我们的系统/程序/字体/图片 等等全部都是加载到内存中的. 我举个例子吧
你双击一个程序, 比如 : myprogram.exe   
你双击这个程序, 
接着 windows 系统,就在硬盘中读入这个程序的数据(1010的二进制数据)  
读取进去之后,  这个程序就加载进内存了...

我曾经做过一个这样的实验, 开机时,让电脑加载U盘的微型操作系统,, 加载完毕之后, 把U盘拔掉, 然后该系统正常运行......
可见, 程序是从硬盘/U盘/磁盘等外部储存器中  加载到内存进来后,在内存内部运行的.....

那么  内存就有很多数据, 而操作这些数据, 就需要地址, 内存地址.
比如一段代码 


如代码,所示, 指针c 储存了 变量a 在内存中的所在地址.
然后在 第13行中,    通过  *c = 99,  这种手段,直接就把 变量a的数据给篡改了

意思就是说, 只要你有  [你所想要的数据]   对应的内存地址, 你就可以通过他的内存地址直接篡改这个数据!
很简单对吧.!!

那么数组又怎么一回事?? 
int data[3] = {7 , 8 , 9}
然后, 又来一个
int *pointer = data;
甚至 还TM的来一个  printf("%d" , pointer[2] )
为什么可以这样!

初学者肯定对此疑惑极了.
好的. 那么介绍一下数组吧

int data[3]
这样子 是在内存中, 开辟了 一段  [长达 3个int长度] 的 内存段      [给你用来装数据 ]
但是 data本身 是什么意思? 就是 这内存段的起始位置的  内存地址
所以 data 单独一个词的话, 表示一个指针哦!
所以可以 这样子来  

int *pointer;
pointer = data; 
(指针赋值给指针  当然是完全可以的了) 

那么 为什么可以这样子用 pointer[2]  ,    QAQ
因为 数组本身就是 pointer的特别形式...  
pointer 本来就可以这么用, 而数组是特殊的pointer, 所以数组也能这么用 

那么 比如, 
char *pointer;
pointer[2] 
这样子 pointer[2] 表示什么呢?
有图有真相
图片

简单地说, 就是 pointer 是一个内存地址
(*pointer) 是该地址内的数据
pointer[0] 也是该地址内的数据
pointer[1] 是pointer地址的下一个单位地址内的数据
pointer[2] 是pointer地址的下两个单位地址内的数据
以此类推


万一  出现这种情况
int a;
int * c;
c = &a;

然后 然后!
printf( "%d", c[5])
会怎样??   变量a 明明只是单一的一块int长度的内存, 却被指针拿去 c[5] 访问到后面第6位的内存数据去了

结果会 crash! 程序奔溃.. 
明明不是你的内存, 你去访问,这是非法的!

另外 pointer[n]  有另外一种表示方法  *(pointer + n) 也行的

那么数组呢,
int a[4];

printf( "%d", a[2] );
完全等效于下面这句
printf( "%d", *(a + 2) ); 

简单地说, 就是 指针变量 和 数组变量的 使用方法, 几乎完全一样!!!
更简单地说, 数组是一种特殊的指针...
特殊在哪里呢?
指针只是指向一个地址而已,
而数组的话, 在定义数组变量时, 开辟了一段内存空间来使用.

理解了吧 = =???


不理解的, 请在下面回复疑惑..

另外再举个例子

void func( int num, int* pointer)
{
printf("%d"  , pointer[ num - 1 ])


int main()
{
int a[77];
printf( 77, a );
return 0;



可以通过数组和指针的共性,  来在函数之间传递数组数据 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值