数组名作为函数的参数传递, 传递的是数组的地址。
因为数组名就是数组的地址 &number = &number[0] == number。
如果数组作为函数的形参, 元素的个数可以省略。
void change2(int values[2]);
void change2(int values[]);//数组作为形参可以省略元素个数
void change2(int values[])
{
values[0] = 99;
}
int main(int argc, const char * argv[]) {
int nums[2] = {1, 5};
change2(nums); // 相当于传递了数组的地址
printf("nums[0] = %i\n", nums[0]);
return 0;
}
练习
1、定义一个函数, 实现遍历数组
#include <stdio.h>
//void printArray(int values[5]);
void printArray(int values[5], int length);
int main(int argc, const char * argv[]) {
// 要求定义一个函数, 实现遍历数组. (只要别人传递数组给函数, 就要求输出数组中所有元素的值)
int nums[3] = {1 , 3 , 5};
// printf("size = %i\n", sizeof(nums));
int length = sizeof(nums) / sizeof(nums[0]);
printArray(nums, length); // 数组名称就是数组的地址
return 0;
}
// 如果传递的数组的名称, 其实传递的是地址
// 如果传递的是地址, 其实传递的是指针
// 指针在64位编译环境占8个字节
// 注意: 如果数组作为形参, 那么在函数中就不能通过数组的名称计算出数组元素的个数
// 因为系统会自动将数组形参转换为指针, 指针占用8个字节
void printArray(int values[5], int length)
{
// printf("size = %i\n", sizeof(values));
// 1.动态计算数组的元素个数
// int length = sizeof(values) / sizeof(values[0]);
// 2.遍历数组
for (int i = 0; i < length; i++) {
printf("values[%i] = %i\n", i,values[i]);
}
}
2、设计一个函数int arrayMax(int a[], int count)找出数组元素的最大值
#include <stdio.h>
int arrayMax(int values[], int length);
int arrayMax2(int values[], int length);
int main(int argc, const char * argv[]) {
// 设计一个函数int arrayMax(int a[], int count)找出数组元素的最大值
int nums[5] = {-99, -188, -5, -100, -77};
int length = sizeof(nums) / sizeof(nums[0]);
// int max = arrayMax(nums, length);
int max = arrayMax2(nums, length);
printf("max = %i\n", max);
return 0;
}
int arrayMax2(int values[], int length)
{
// 1.定义变量, 保存数组中最大值的角标(索引)
int max = 0;
// 2.遍历数组
for (int i = 1; i < length; i++) {
// 3.取出数组中对应角标的元素的值进行比较
if (values[max] < values[i]) {
// 如果当前遍历到的角标对应的元素的值大于max这个角标对应元素的值
// 那么就将当前的角标最为最大值的角标
max = i;
}
}
return values[max];
}
int arrayMax(int nums[], int length)
{
// 1.定义一个变量, 假设为最大值
// int max = 0; // 注意: 不能假设一个不是数组中的值最为最大
int max = nums[0];
// 2.遍历数组
for (int i = 1; i < length; i++) {
// 3.依次取出数组中每一个元素的值, 和假设的最大值进行比较
// 如果数组的元素大于假设的最大值, 就让当前元素的值作为最大值
if (max < nums[i]) {
max = nums[i];
}
}
return max;
}
3、从键盘输入3个0~9的数字,然后输出0~9中哪些数字没有出现过(桶排序)
#include <stdio.h>
int main(int argc, const char * argv[]) {
// 从键盘输入3个0~9的数字,然后输出0~9中哪些数字没有出现过
// 从键盘输入100个0~2000的数字,然后输出0~2000中哪些数字没有出现过
/*
输入: 1, 3 ,5
输出: 0, 2, 4, , 6, 7, 8, 9
*/
/*
// 1.接收用户输入的数据
int num1, num2, num3;
printf("输入三个整数, 用逗号隔开\n");
scanf("%i,%i,%i", &num1, &num2, &num3);
// 2.遍历打印0~9
for (int i = 0; i <= 9; i++) {
// 3.判断当前打印的值是否是用户输入的值, 如果是就不打印
if (num1 != i &&
num2 != i &&
num3 != i) {
printf("%i\n", i);
}
}
*/
// 空间换时间
// 1.定义数组保存所有用户输入的数
int nums[10] = {0};
// 2.接收用户输入的数据
int value = -1;
for (int i = 0; i < 3; i++) {
printf("请输入%i个整数\n", i+1);
scanf("%i", &value);
nums[value] = 1;
}
for (int i = 0; i < 10; i++) {
// printf("nums[%i] = %i\n", i , nums[i]);
if (nums[i] != 1) {
printf("%i\n", i);
}
}
return 0;
}
4、从键盘输入6个0~9的数字,排序后输出(桶排序)
#include <stdio.h>
int main(int argc, const char * argv[]) {
// 要求从键盘输入6个0~9的数字,排序后输出
// 0~9999
// 1.定义数组保存用户输入的数据
int nums[10] = {0};
// 2.接收用户的数据
int value = -1;
for (int i = 0; i < 6; i++) {
printf("请输入第%i个数据\n", i + 1);
scanf("%i", &value); // 2, 2, 1, 2
// 7, 3, 6, 1
// nums[value] = 1;
nums[value] = nums[value] + 1;
}
for (int i = 0; i < 10; i++) { // i == 7
// printf("nums[%i] = %i\n", i , nums[i]);
/*
if (nums[i] != 0) {
printf("%i\n", i); // 1, 2, 2, 2
}
*/
for (int j = 0; j < nums[i]; j++) { // j == 1
printf("%i\n", i); // 1, 1, 2, 3, 3, 6
}
}
return 0;
}
5、选择排序
#include <stdio.h>
int main(int argc, const char * argv[]) {
// 已知一个无序的数组, 里面有8个元素, 要求对数组进行排序
int nums[8] = {99, 12, 88, 34, 5, 44, 12, 100};
int length = sizeof(nums) / sizeof(nums[0]);
printf("length = %i\n", length);
for (int i = 0; i < length; i++) {
printf("nums[%i] = %i\n", i, nums[i]);
}
// length - 1是为了防止角标越界
// length - 1因为最后一个元素已经没有可以比较的了
// 0, 1, 2, 3, 4
for (int i = 0; i < length - 1; i++) {
for (int j = i+1; j < length; j++) {
if (nums[i] > nums[j]) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
printf("--------------\n");
for (int i = 0; i < length; i++) {
printf("nums[%i] = %i\n", i, nums[i]);
}
return 0;
}
6、冒泡排序
#include <stdio.h>
int main(int argc, const char * argv[]) {
/*
思路:
1.先分析如何比较
2.找出比较的规律比较完一次之后第二次比较会少一次
3.打印倒三角
4.打印需要比较的角标
5.比较并交换位置
6.将常量替换为变量(length)
*/
// 已知一个无序的数组, 里面有5个元素, 要求对数组进行排序
int nums[6] = {99, 12, 88, 34, 5, 7};
int length = sizeof(nums) / sizeof(nums[0]);
for (int i = 0; i < length; i++) {
printf("nums[%i] = %i\n", i, nums[i]);
}
for (int i = 0; i < length - 1; i++) {
for (int j = 0; j < length - 1 - i; j++) {
// printf("*");
// printf("%i == %i\n", j, j+1);
if (nums[j] > nums[j + 1]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
// printf("\n");
}
printf("----------\n");
for (int i = 0; i < length; i++) {
printf("nums[%i] = %i\n", i, nums[i]);
}
return 0;
}