ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1.打印菱形 2. 字符串逆序输出 3. 解释栈区存放原理 day (10)

2021-11-15 23:05:14  阅读:132  来源: 互联网

标签:栈区 10 arr int ebp printf main day 指针


1. int main() 
{
    int a = 0; 
    scanf("%d", &a);//输入要打印菱形的大小  
    for (int i = 0; i < a; i++)
    {
        int j = 0;
        for (j = 0; j <a-i-1; j++)
        {
            printf(" ");
        }
        for (j = 0; j <(2*i)+1; j++)
        {
            printf("*");
        }
        printf("\n");
    }
    for (int i = 0; i <a-1; i++)
    {
        int j = 0;
        for (j = 0; j<i+1;j++)
        {
            printf(" ");

        }
        for (j = 0; j <(2*(a-1-i))-1; j++)
        {
            printf("*");
        }
        printf("\n");

    }          
    system("pause");
    return 0;
}

注意 输入的是菱形的一半:

2 字符串逆序输出  void reverse(char* arr)
{
    unsigned int len = strlen(arr);
    char* left = arr;
    char* right = arr+len - 1;  //注意一定是arr+len -1;  如果没有arr  地址就不对了 不能知道末端了;  注意也不能写成 int *left 要跟arr 对应 都是char   写成int * 一次跳过四个字节
    while (left <= right)
    {
        int tmp = 0;
        
        tmp = *right;
        *right = *left;
        *left = tmp;
        right--;
        left++;
    }
    
    
}

int main()
{

    char arr[50] = { 0 };
     gets(arr);   //gets的作用是将键盘输入的字符串传递给arr  注意是gets  不要写成fgets

     reverse(arr);//字符串逆序
     printf("%s ", arr);
    
     //补充一个知识点        int*arr[10]  是指针数组 里面的每一个元素放的地址     int(*arr)[10]就是
    //数组指针数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。例:int (*p)[10]; p即为指向数组的指针,又称数组指针。
    system("pause");
    return 0;
}

**********下面用一个加法运算解释关于栈区的一些知识:

1.摁住f10  右击 转到反汇编

首先要明白 main 函数也是被调用的 调用顺序位 

main CRT Start up;

--main CRT Start up;

main   所以栈区先创建上述两个空间

接着创建main函数的

接着明白ebp esp ebp栈底 esp 栈顶  push 是压栈的动作  mov ebp.esp 是将esp的内容传递给ebp 想象一下此时会发生什   接着连续3个push ebx esi edi 记住他们可都是就寄存器  对电脑来说 内存 硬盘 寄存器 存放   还有一个lea 全名 load effective address   接着将显示符号名字去掉

 这里还有一个知识点 就是 栈区使用的时候 先使用高地址 后使用低地址 这个肯定都知道吧  并且数组是从低到高的  所以那个ebp-24h(24h16进制) 就是从ebp往后走一段空间 并且这些空间会被接下来的0cccca初始化 

还有一点就是dword 是doubleword  一个word 两个字节 既然double 就是4个啦呗 

 

f11进入函数内部后 原理一样 

总之调试之后应该明白 形参跟实参的关系  改变形参不会改变实参 他们只是值相同 址根本不同 (临时引用)并且指定 a跟b   是从右往左放入的 先放入b后放入a  还有一点就是 a b 不是创建在add函数里面 main 函数及创建了     

标签:栈区,10,arr,int,ebp,printf,main,day,指针
来源: https://blog.csdn.net/qq_53217755/article/details/121344867

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有