我加的技术交流微信群中 , 不少人搞不清数组与指针的关系, 对指针感觉很困惑. 会用指针, 但是又感觉隔着一层纱, 摸不着本质.
所以这里说一说吧,
先从内存谈起.. 内存 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;
}
可以通过数组和指针的共性, 来在函数之间传递数组数据
所以这里说一说吧,
先从内存谈起.. 内存 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;
}
可以通过数组和指针的共性, 来在函数之间传递数组数据