5.使用指针访问数组
#include<stdio.h>
int main(void)
{
int arr[10] = { 0 };
//使用指针来访问数组
int sz = sizeof(arr) / sizeof(arr[0]);
//输入十个值
int* p = arr;
int i = 0;
for (i = 0; i <= 10; i++)
{
//输入一个值
scanf("%d\n", p + i); //p+i == &arr[i]
}
//输入10个值
for (i = 0; i < sz; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
1.数组就是数组,是一块连续的空间(数组的大小和数组元素个数和元素类型都有关系);
2.指针(变量)就是指针(变量),是一个变量(4/8个字节);
3.数组名是地址,是首元素的地址;
4.可是使用指针来访问数组。
*(p+i) == p[i] == * (arr + i) == arr[i] == * (i+arr) == i [arr] !!!
6.一维数组传参的本质
我们之前都是在函数外部计算数组的元素个数,那我们可以把数组传给一个函数后,函数内部求数组元素个数吗?
#include<stdio.h>
void Print(int arr[10], int sz)
{
int i = 0;
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);//1,2,3,4,5,6,7,8,9,10
}
}
int main(void)
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
Print(arr, sz); //数组名就是数组首元素地址
return 0;
}
这里如果把计算数组元素个数的sz放在函数调用中,打印出来的就不是1~10的元素了,具体原因看以下代码:
#include<stdio.h>
void Print(int* p, int sz) //应该是指针
{
int i = 0;
for ( i = 0; i < sz; i++)
{
printf("%d ", *(p + i));//1,2,3,4,5,6,7,8,9,10
}
}
int main(void)
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
Print(arr,sz); //数组名就是数组首元素地址
return 0;
}
#include<stdio.h>
void test1(int arr[])//参数写成数组形式,本质上还是指针
{
printf("%d\n", sizeof(arr)); //8
}
void test2(int* arr)//参数写成指针形式
{
printf("%d\n", sizeof(arr));// 8 计算一个指针变量的大小
}
int main(void)
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
test1(arr);
test2(arr);
return 0;
}
7.冒泡排序
冒泡排序的核心思想是:两两相邻元素进行比较。
9 8 7 6 5 4 3 2 1 0
8 9 7 6 5 4 3 2 1 0
8 7 9 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1 0 9
8 7 6 9 5 4 3 2 1 0 7 8 6 5 4 3 2 1 0 9
8 7 6 5 9 4 3 2 1 0 7 6 8 5 4 3 2 1 0 9
8 7 6 5 4 9 3 2 1 0 7 6 5 8 4 3 2 1 0 9
8 7 6 5 4 3 9 2 1 0 7 6 5 4 8 3 2 1 0 9
8 7 6 5 4 3 2 9 1 0 .。。。。。。。。。。。
8 7 6 5 4 3 2 1 9 0 7 6 5 4 3 2 1 8 0 9
8 7 6 5 4 3 2 1 0 9 7 6 5 4 3 2 1 0 8 9
这是第一趟,解决了一个数字的排序,10个元素要比较9次,9个元素要比较8次,8个元素要比较7次,n个元素要比较n-1次。
#include<stdio.h>
//升序
void bubble_sort(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]) //比如arr[j]是9,arr[j+1]是8,
//要升序排列就把8和9的位置交换一下
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
//打印
void print_sort(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int main(void)
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
//排序
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
//打印
print_sort(arr, sz);
return 0;
}
8.指针数组模拟二维数组
#include<stdio.h>
int main(void)
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7, };
int* arr[] = { arr1,arr2,arr3 };
//打印数组
int i = 0;//有3组
for (i = 0; i < 3; i++)
{
int j = 0;//5个元素
for (j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
9.字符指针变量