文章目录
1.除了形参使用数组或者指针,通过全局变量也能做到把函数处理结果的二个数据返回给主调函数。
解析:
全局变量在函数当中被改变,自然主调函数内他的值也变了,但不建议这样使用!
//1.数组
void test(int arr[])
{
arr[0] = 1;
arr[1] = 2;
}
int main()
{
int arr[10] = { 0 };
test(arr);
return 0;
}
//2.指针
void test(int*p1, int *p2)
{
*p1 = 1;
*p2 = 2;
}
int main()
{
int a = 0;
int b = 0;
test(&a, &b);
return 0;
}
//3.全局变量
int a;
int b;
void test()
{
a = 1;
b = 2;
}
int a = 0;
int b = 0;
int main()
{
test();
return 0;
}
2.声明数组时不能用常变量,引用数组的时候大胆用常变量。
数组定义声明时不建议用常变量,编译器会报错;引用数组时大胆用常变量
//X定义声明时不建议用常变量,会报错
int n=1;
int arr[n]={0};
//√引用时大胆用常变量
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
3.数组初始化的几组实例:
int型数组自动补充0;char型数组自动补充\0
//一样的效果
int arr2[] = { 1,2,3,4,5 };
int arr2[5] = { 1,2,3,4,5 };
//ch1是bit00,ch2是bit
char ch1[5] = {'b', 'i', 't'};
char ch2[] = { 'b', 'i', 't' };
//ch3是b i t \0 0,ch4是b i t \0
char ch3[5] = "bit";
char ch4[] = "bit";
//ch5是b i t \0,ch6是b i t,前者字符串长度4,后者长度3
char ch5[] = "bit";//这里会补\0
char ch6[] = { 'b', 'i', 't' };
4.数组是相同类型的一段连续的空间,下标是从0开始的。
比如:int array[N],下标的范围为[0,N),其中N位置不能存储有效元素。
具体实例:定义了一维 int 型数组 a[10] 后,引用a[10] = 2会越界。
5.区分strlen与sizeof,看看下面代码具体结果:
#include <stdio.h>
int main()
{
char str[] = "hello bit";
printf("%d %d\n", sizeof(str), strlen(str));
return 0;
}
解析:str字符数组使用"hello bit"初始化,最终也会将’\0’放置到数组中,因此数组中总共有10个元素。
sizeof(str):获取数组的总大小,10个元素,每个元素占1个字节,因此总共是10个字节。
strlen(str): 获取字符串中有效字符的个数,不算’\0’,因此总共9个有效字符。
故上述printf会分别打印:10 9
6.对于二维数组int array[M][N], 说明如下:
1.M和N都必须为常数,
2.M代表数组有M行,N代表每行中有N个元素
3.其中M可以省略,省略后必须给出初始化表达式,编译器从初始化结果中推断数组有多少行
4.N一定不能省略,因为N省略了就不能确定一行有多少个元素,也不能确定数组有多少行
7.二维数组在内存中是连续存储的
int arr[][4] = { {1,2}, {3,4} ,{4,5} };
int i = 0;
int j = 0;
int* p = &arr[0][0];
for (i = 0; i < 12; i++)//按顺序输出数组内12个元素
{
printf("%d ", *p);
p++;
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
可以观察到俩个for循环的结果,第一个for循环先逐列输出,再换行继续;第二个for循环结果可知每个元素地址差为4.
8.冒泡排序
flag是为了尽可能减少计算,不加flag计算量可能会大些。
void bubble_sort(int arr[], int sz)//形参arr本质是指针
{
//确定趟数
int i = 0;
for (i = 0; i < sz - 1; i++)
{
//一趟冒泡排序的过程
int j = 0;
int flag = 1;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
//交换
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;
}
}
if (flag == 1)
{
break;
}
}
}
int main()
{
//int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
//排序为升序 - 冒泡排序
//计算数组元素个数
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);//数组传参的时候,传递的其实是数组首元素的地址
return 0;
}
9.数组名是什么?
数组名是数组首元素的地址,但是有2个例外 :
- sizeof(数组名) - 数组名表示整个数组 - 计算的是整个数组的大小,单位是字节
- &数组名 - 数组名表示整个数组 - 取出的是整个数组的地址
int arr[10] = { 0 };
printf("%p\n", &arr);//&arr取出的是整个数组的地址
printf("%p\n", &arr+1);//可以看到地址加了40,加了整个数组的地址,
printf("%p\n", arr);//取出的是数组的首地址
printf("%p\n", arr+1);//可以看到地址加了4,加了数组一个元素的地址大小。
int sz = sizeof(arr);//数组名表示整个数组