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 函数及创建了