数组与指针数组 汇编区别

int array[] = {2,3,4,5};
00A3355E mov dword ptr [array],2
00A33565 mov dword ptr [ebp-10h],3
00A3356C mov dword ptr [ebp-0Ch],4
00A33573 mov dword ptr [ebp-8],5
int *p =array;
00A3357A lea eax,[array]
00A3357D mov dword ptr [p],eax

printf("%d\t",array[2]);
00A33580 mov esi,esp
00A33582 mov eax,dword ptr [ebp-0Ch]
00A33585 push eax
00A33586 push offset string "%d/t" (0A357A0h)
00A3358B call dword ptr [__imp__printf (0A382C0h)]
00A33591 add esp,8
00A33594 cmp esi,esp
00A33596 call @ILT+315(__RTC_CheckEsp) (0A31140h)
printf("%d\t",p[2]);
00A3359B mov esi,esp
00A3359D mov eax,dword ptr [p]
00A335A0 mov ecx,dword ptr [eax+8]
00A335A3 push ecx
00A335A4 push offset string "%d/t" (0A357A0h)
00A335A9 call dword ptr [__imp__printf (0A382C0h)]
00A335AF add esp,8
00A335B2 cmp esi,esp
00A335B4 call @ILT+315(__RTC_CheckEsp) (0A31140h)
printf("%d\t",*(p+2));
00A335B9 mov esi,esp
00A335BB mov eax,dword ptr [p]
00A335BE mov ecx,dword ptr [eax+8]
00A335C1 push ecx
00A335C2 push offset string "%d/t" (0A357A0h)
00A335C7 call dword ptr [__imp__printf (0A382C0h)]
00A335CD add esp,8
00A335D0 cmp esi,esp
00A335D2 call @ILT+315(__RTC_CheckEsp) (0A31140h)
return 0;
00A335D7 xor eax,eax

数组名本身是一个地址常量

下表寻址是通过(首地址+偏移量)实现

指针本身是个变量,其值才是数组首地址

指针寻址要先取其值,再加偏移

时间: 2024-10-12 16:54:42

数组与指针数组 汇编区别的相关文章

数组、指针数组、数组指针、返回数组指针的函数的关系

直接上代码吧,解释说得很清楚了. // C++Primer.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include <iostream> using namespace std; int (*function(int i))[10];//返回数组指针的函数 int main() { cout<<"数组.指针数组.数组指针.返回数组指针的函数:"<<endl<<endl; in

qsort 函数的使用——对普通数组、指针数组、二维数组中的元素进行排序

在ANSI C中,qsort函数的原型是 #include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *)); 解释:qsort函数对含有nmemb个元素的数组进行排序,而base指针指向数组的第一个元素.这个数组的元素个数由size指定. compar函数对qsort的比较操作进行定义,所以可以定制数字的比较,字符串的比较,甚至结构体

数组与指针(数组中所有元素的和)

//1.下面这个例子是计算数组中所有元素的和 //数组与指针的关系,整型是4个字节,a[] == *a, a[i] = *(a+i) #include <stdio.h> #define SIZE 10 int sum (int a[],int n); int main(){ int ar [SIZE] = {10,20,30,40,50,60,70,80,90}; long answer; answer = sum(ar, SIZE); //重点是这一句,ar为int [10]类型 prin

二维数组和指针数组做形参

先回顾一下二维数组的写法: 1. int array[3][4]; 2. int array[][4]; 3. int (*array)[4]; 不管怎么样,二维的长度是不能省略的,多维数组(不管二维,三维,四维...)最多只能省略第一维的长度; 比较好玩的是第三种: 注意两种不同: int (*array1)[N]; int  *array2[N]; 我比较喜欢下面这种方式,那么两种有什么不同呢,int (*array1)[N] ------array1是一个指向一维数组的指针, 而  int

c++ 用new创建二维数组~创建指针数组【转】

#include <iostream> using namespace std; void main() { //用new创建一个二维数组,有两种方法,是等价的 //一: int (*p)[10] = new int[5][10]; //二: int **p = new int* [5]; for(int i=0;i <5;i++) p[i] = new int[10]; //指针数组的创建,也有两种方法 //一: char **pa = new char* [4]; for (int

c语言中数组,指针数组,数组指针,二维数组指针

1.数组和指针 int array[5] = {1,2,3,4,5};// 定义数组 // 1. 指针和数组的关系 int * pa = array; pa = array; // p[0] == *(p+0) == array[0] == *(array+0) printf("%p\n", pa); printf("%p\n", array); /* 访问数组两种方式 1. 下标法访问 数组名[下标] 指针[下标] 下标:偏移量 2. 指针法访问 *(p+1) *

复习一下整型数组,字符数组,整型指针数组,字符指针数组,整型数组指针,字符数组指针

20:52:01 2019-12-31 整型数组 int a[10];字符数组 char b[10]; _______________________整型指针数组 int *p[10]; |__|__|__|__|__|__|__|__|__| 每个格子里存的是一个指针,每个指针都是int类型的,会指向一个int的值. 1 for(int i=0; i<10; i++) 2 p[i] = &a[i]; //把a中的每个元素的地址都放在了指针数组p里. 3 4 for(int j=0; j&l

二维数组和指针数组

#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int arr1[3]; int arr2[3]; int arr3[3]; int * ptr; // ptr1是一个指向 int [3] 的指针,即ptr的类型和&arr1的类型是一样的,注意:arr1指向的内存区域定长 int ptr1[3][3]={{1,2,3

指针数组和数组指针的区别以及main函数

1.C语言中的数组有自己特定的类型 2.数组的类型有元素类型和数组大小共同决定 3.C语言中通过typedef为数组类型重命名 typedef type(name)[size]; 数组指针 1.数组指针用于指向一个数组 2.数组名是数组首元素的起始地址,但并不是数组的起始地址 3.通过将取地址符&作用于数组名可以得到数组的起始地址 4.可通过数组类型定义数组指针: ArrayType* pointer; 5.也可以直接定义:type (*pointer)[n];pointr为数组指针变量名,ty