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

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函数的

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

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

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

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

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

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

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

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

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

上一篇:反汇编测试


下一篇:spark执行优化——依赖上传到HDFS(spark.yarn.jar和spark.yarn.archive的使用)