数组名的理解
其实数组名就是首元素的地址名
但是以下代码输出的是40
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
printf("%d",sizeof(arr));
return 0;
}
注意⚠️
其中&arr+1是跳过整个数组
使用数组访问指针
ag.1用指针的方法输入数组并且打印数组
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int* p = arr;
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < sz; i++)
{
scanf("%d", p + i);
}
for (int i = 0; i < sz; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
把printf中的*(p+i)改为p[i]也是一样的
所以*(p+i)==p[i]
一维数组传参的本质
text(arr),arr是数组名是数组首元素的地址,text传的是首元素的地址,所以void整形指针来接收
一维数组传参的时候,形参可以写成数组的形式,但本质上是指针变量
冒泡排序
本质:俩俩相邻数组比较.
void maopao(int arr[], int sz)
{
int i = 0;
for (i = 0; i <sz-1 ; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void print(int arr[], int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[10] = { 9,3,6,2,2,5,4,8,7,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
print(arr, sz);
maopao(arr,sz);
print(arr, sz);
return 0;
}
若比较的是比较有序的数字,那么这个比较繁琐,所以,可以给他做出优化。
当经历一次冒泡排序的时候发现没有改变,说明已经排序完成。以下为代码
void maopao(int arr[], int sz)
{
int i = 0;
for (i = 0; i <sz-1 ; i++)
{
int j = 0;
int k = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
k = 1;
}
}
if (k == 0)
{
break;
}
}
}
void print(int arr[], int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,9,8,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
print(arr, sz);
maopao(arr,sz);
print(arr, sz);
return 0;
}
二级指针
二级指针用来存放一级指针变量的地址
和二维数组没啥关系,就是指针的内容
指针数组
就是存放指针的数组