如何整理网站,换网站后台,做设计找参考的设计网站有那些,像淘客基地这样的网站如何做文章目录 一、数组名的理解#xff08;1#xff09;数组的地址与数组首元素地址的区别 二、使用指针访问数组#xff08;1#xff09;一维数组传参的本质 三、冒泡排序#xff08;1#xff09;什么是冒泡排序#xff08;2#xff09;写冒泡排序 四、结束语 一、数组名的… 文章目录 一、数组名的理解1数组的地址与数组首元素地址的区别 二、使用指针访问数组1一维数组传参的本质 三、冒泡排序1什么是冒泡排序2写冒泡排序 四、结束语 一、数组名的理解
首先回顾一下指针访问数组的内容
int arr[]{1,2,3,4,5,6,7,8,9};
int * paarr[0];//pa是指针变量这里一个arr[0]它是指数组首元素的地址但是数组名也是地址并且也是数组首元素的地址 我们可以做个简单的测试
#includestdio.h
int main()
{int arr[] { 1,2,3,4,5,6,7,8,9 };int* ps arr[0];printf(arr%p\n, arr);printf(arr[0]%p\n, arr[0]);return 0;
}由运算结果就可以得出我们的结论数组名是首元素的地址。
有两个特例的地方 #includestdio.h
#includestring.h
int main()
{int arr[] { 1,2,3,4,5,6,7,8,9 };int* pa arr[0];printf(%d, sizeof(arr));return 0;
}输出的结果是36大家可能会想arr如果是地址的话在不同的环境下输出的结果会不同也就是在x86或者在x64的环境那应该输出4或者8才对。
对于上面的代码可能大家会有些不理解了其实这是arr的特殊情况之一。
sizeof(arr) : sizeof中单独放数组名这里的数组名表示整个数组计算的是整个数组的大小单位是字节。 #includestdio.h
int main()
{int arr[] { 1,2,3,4,5,6,7,8,9 };int* pa arr[0];printf(%p\n, arr);return 0;
}这里的**数组名**这里是的数组名表示的是整个数组取出的是整个数组的地址整个数组的地址与首元素的地址是有区别的可以1试试看结果不同。
除此之外任何地方使用数组名数组名都表示首元素的地址。
1数组的地址与数组首元素地址的区别
#includestdio.h
int main()
{int str[] { 1,2,3,4,5,6,7,8,9,10 };printf(str[0] %p\n, str[0]);printf(str[0]1 %p\n, str[0]1);printf(str %p\n, str);printf(str1 %p\n, str1);return 0;
}这里的str[0]1就是跳过⼀个元素。
但是str和str1相差40个字节这就是因为str是数组的地址1操作是跳过整个数组的。 二、使用指针访问数组
例子我们写一个代码来输出数组要求要使用到指针
#includestdio.h
void V_copy(int* str, int len)
{for (int i 0; i len; i){printf(%d , *str);str;}printf(\n);
}
int main()
{int str[] { 2,4,5,6,1,7,4,9,3,0,8 };int* pa str[0];int len sizeof(str) / sizeof(str[0]);V_copy(str, len);return 0;
}printf(%d , *str);str;我们可以把这里改写成printf“%d”,*(stri 的形式本质上和上面的那个形式是一样的。
将*(stri)换成str[i]也是能够正常打印的所以本质上str[i]是等价于*(stri)。
如果我们想要有自己的输入那么我们可以加上下面的代码
for (int i 0; i len; i)
{scanf(%d, pa i);
}我们最后的代码也可以写成下面的形式
#includestdio.h
int main()
{int str[10] { 0 };int* pa str[0];int len sizeof(str) / sizeof(str[0]);for (int i 0; i len; i){scanf(%d, pa i);}for (int i 0; i len; i){printf(%d , *(pa i));}return 0;
}1一维数组传参的本质 #includestdio.h
void Print(int arr[])
{int len1 sizeof(arr) / sizeof(arr[0]);int sz2 len1;printf(sz2%d\n, sz2);}
int main()
{int arr[] { 1,1,2,3,4,5,6,7,8,9 };int len sizeof(arr) / sizeof(arr[0]);int sz len;printf(sz%d\n, sz);Print(arr);return 0;
}由结果我们可以发现函数的内部并没有得到正确的数组元素个数。
由上面 的知识我们可以知道数组名是数组首元素的地址数组传参我们传递的是数组名也就
是说本质上数组传参传递的是数组首元素的地址。
函数参数本质上是指针所以函数内部没办法求数组元素的个数。
所以这里的 void Print(int arr[])我们可以改写成void Print(int*arr)这个是指针的形式
三、冒泡排序
1什么是冒泡排序
冒泡排序就是指相邻的两个数作比较根据你想要的结果最后输出比如我想要输出135278649这几个数字的升序那么我们就需要先1很3比较3大于1所以3和1的位置不交换再3和5比较5是大于3的也不交换再2和5 比较5大于25应该在2的后面所以5和2比较以此类推当第一次轮完后也就是知道最后一个数字是9之后我们再来第二次的比较此时数字9的位置不再改变因为它就是最大的且位于这个数组的最后一个位置。 2写冒泡排序
#includestdio.h
void Button_c(int *str, int len)
{for (int i 0; i len - 1; i){for (int j 0; j len - 1 - i; j){if (*(strj) *(str j1)){int tem *(strj);*(strj) *(str j1);*(str j1) tem;}}}}
void print(int* str, int len)
{for (int i 0; i len; i){printf(%d , *(str i));}
}
int main()
{int str[10] { 1,4,2,3,7,5,6,8,9,10 };int len sizeof(str) / sizeof(str[0]);Button_c(str, len);print(str,len);return 0;
}上面的代码可以输出我们想要的结果感觉编译器进行比较的次数有点多因为它会反复比较即使位置是符合升序的数字这就是上面代码的弊端。
所以我们简单的进行一些优化设一个变量flage,假设flage1表示这相邻的两个数符合升序不需要交换如果相邻的两个数进行了交换那我们就可以改变flage的值可以让它被赋值为0因此我们可以进行以下操作
#includestdio.h
void Button_c(int* str, int len)
{for (int i 0; i len - 1; i){int flage 1;for (int j 0; j len - 1 - i; j){if (*(str j) *(str j 1)){int tem *(str j);*(str j) *(str j 1);*(str j 1) tem;flage 0;}}if (flage 1){break;}}
}
void print(int* str, int len)
{for (int i 0; i len; i){printf(%d , *(str i));}
}
int main()
{int str[10] { 1,4,2,3,7,5,6,8,9,10 };int len sizeof(str) / sizeof(str[0]);Button_c(str, len);print(str, len);return 0;
}四、结束语
关于冒泡排序就到这里了后续我会继续写关于冒泡排序的改进版本。
大家不理解的地方可以自己再反复看看或者查查资料希望可以和大家一起进步