目录
1.数组指针
2.指针数组
执行结果
底层分析
1.数组指针
从语文的角度理解,"数组"修饰"指针".因此数组指针是指针
例如以下代码
#include <stdio.h>
int main()
{char a[5] = { "ABCDE" };return 0;}
其中a就是数组指针,因为数组名代表数组首元素的地址,该数组名指向数组的首元素A
2.指针数组
从语文的角度理解,"指针"修饰"数组".因此指针数组是数组
由指针数组的定义,如果存储一级指针,则就要定义类型为二级指针的数组来存储
例如以下代码
#include <stdio.h>
int main()
{char* a[5] = { "ABC","DEF","GHI","JKL","MNO" };return 0;}
下断点至return 0;,打开内存窗口,输入&a
发现存储的元素的值是地址0x00e47bcc,0x00e47bd0,0x00e47bd4,0x00e47bd8,0x00e47bdc
相邻两个值都差4
地址栏输入0x00e47bcc,跳转到的是存储字符串的内存空间
打印指针数组指向的字符串
#include <stdio.h>
int main()
{char* a[5] = { "ABC","DEF","GHI","JKL","MNO" };for (int i=0;i<5;i++)printf("%s ", a[i]);return 0;
}
注意:打印char*类型的数据,直接就是%s,后面跟char*类型的首元素地址
执行结果
底层分析
调试模式下,转到反汇编
只看重点部分
char* a[5] = { "ABC","DEF","GHI","JKL","MNO" };
00E44A76 mov dword ptr [a],offset string "ABC" (0E47BCCh)
00E44A7D mov dword ptr [ebp-14h],offset string "DEF" (0E47BD0h)
00E44A84 mov dword ptr [ebp-10h],offset string "GHI" (0E47BD4h)
00E44A8B mov dword ptr [ebp-0Ch],offset string "JKL" (0E47BD8h)
00E44A92 mov dword ptr [ebp-8],offset string "MNO" (0E47BDCh)
注意到"offset string",是将字符串的地址存储到数组中,因此顾名思义,为指针数组