目录
二、数组
1、数组名的理解
1.1、【 数组名就是数组首元素(第一个元素)的地址 】
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("&arr[0] = %p\n", &arr[0]); // &arr[0] = 00000052A2D6FAD8
printf(" arr = %p\n", arr); // arr = 00000052A2D6FAD8
return 0;
}
1.2、唯一的例外:
sizeof(数组名):sizeof中单独存放数组名,这里的数组名表示整个数组,计算的是整个数组的大小
&数组名:这里的数组名表示整个数组,取出的是整个数组的地址
【其他时候,任何地方使用数组名,数组名都表示首元素的地址】
2、使用指针访问数组
1.1 、使用下标访问数组
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
scanf("%d", &arr[i]); //1 2 3 4 5 6 7 8 9 10
}
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]); //1 2 3 4 5 6 7 8 9 10
}
return 0;
}
1.2、使用指针访问数组
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
int* p = arr; //== int* p = &arr[0]
for (i = 0; i < sz; i++)
{
scanf("%d",p+i); //1 2 3 4 5 6 7 8 9 10
// scanf("%d",arr+i);
}
for (i = 0; i < sz; i++)
{
printf("%d ", *(p+i)); //1 2 3 4 5 6 7 8 9 10
// printf("%d ", *(arr+i));
// printf("%d ", arr[i]);
}
return 0;
}
*(arr+i) <==> arr[i]
小tips:
数组就是数组,是一块连续的空间,可以存放一个或多个数据;
指针变量是一个变量,是可以存放地址的变量;
数组与指针不同,但指针可以访问数组。
3、一维数组传参
#include<stdio.h>
void test(int arr[])
//void test(int * arr)
{
int sz2 = sizeof(arr) / sizeof(arr[0]);
printf("sz2=%d\n", sz2);
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz1 = sizeof(arr) / sizeof(arr[0]);
printf("sz1=%d\n", sz1);
test(arr);
return 0; //sz1=10
} //sz2=1 (x86下)
本质上数组传参传递的是数组首元素的地址
3.1、冒泡排序
核心思想:两两相邻的元素进行比较。不满足顺序就交换,满足就找下一对
【有n个元素,进行n-1趟(一趟解决一个数字)】
//冒泡排序(升序)
#include<stdio.h>
void intput(int arr[],int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
scanf("%d", &arr[i]);
}
}
void bubble_sort(int* arr, int sz)
{
//确定趟数
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int flag = 1;//假设数组本身满足升序要求
//每一趟内部比较
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
flag = 0;//不是升序
//进行交换
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
if (flag == 1)
{
break; //跳出for(i=0;i<sz-1;i++)这个循环
}
}
}
void printf_arr(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[10] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
intput(arr, sz); //输入一组数据
bubble_sort(arr, sz); //进行排序(冒泡升序)
printf_arr(arr, sz); //打印数组
return 0;
}
三、二级指针
二级指针变量是用来存放一级指针变量的地址
#include<stdio.h>
int main()
{
int a = 10;
int* pa = &a; //pa是一级指针变量
int** ppa = &pa; //ppa是二级指针变量
printf("%d\n",**ppa); //10
**ppa = 200;
printf("%d\n",a); //200
return 0;
}
【**ppa == *pa == a】
四、指针数组
指针数组是:存放指针的数组。
指针数组的每个元素都是用来存放地址(指针)的,每个元素都是指针类型
如图:
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
int c = 30;
//int* pa = &a;
//int* pb = &b;
//int* pc = &c;
int* arr[3] = { &a,&b,&c };
int i = 0;
for (i = 0; i < 3; i++)
{
printf("%d ", *(arr[i])); // 10 20 30
}
return 0;
}
1、指针数组模拟二维数组
#include<stdio.h>
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };
//数组名是数组首元素的地址,类型是int*的,可以存放在parr数组中
int* parr[3] = { arr1,arr2,arr3 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("%d ", parr[i][j]);
//printf("%d ", *(*(parr+i)+j));
}
printf("\n");
}
return 0;
}
到这里指针理解系列2就结束啦!(未完待续哦)