今天我主要学习了指针运算、指针历遍、冒泡排序、二级指针、指针模拟二维数组等内容,下面将我今天所学知识分享给大家
1. 数组地址与指针运算
int main()
{
int arr[10] = { 0 };
printf("arr =%p\n", arr); // arr是数组首元素地址
printf("arr+1 =%p\n", arr + 1); // arr+1是下一个元素的地址(加一个int大小)
printf("arr[0] =%p\n", &arr[0]); // 首元素地址
printf("arr[0]+1 =%p\n", &arr[0] + 1); // 下一个元素地址
printf("^&arr =%p\n", &arr); // 整个数组的地址
printf("^&arr+1 =%p\n", &arr + 1); // 跳过整个数组的地址(加10个int大小)
return 0;
}
2. 指针遍历数组输入输出(方式一)
int main()
{
int arr1[10] = { 0 };
int* p = arr1; // p指向数组首元素
int sz = sizeof(arr1) / sizeof(arr1[0]); // 计算数组元素个数
// 输入数据
for (int i = 0; i < sz; i++)
{
scanf("%d", p); // 通过指针输入数据
p++; // 指针移动到下一个元素
}
// 重置指针并输出
p = arr1;
for (int i = 0; i < sz; i++)
{
printf("%d ", *p); // 解引用指针输出值
p++;
}
}
3. 指针遍历数组输入输出(方式二)
int main()
{
int arr1[10] = { 0 };
int* p = arr1;
int sz = sizeof(arr1) / sizeof(arr1[0]);
// 使用数组名+偏移量输入
for (int i = 0; i < sz; i++)
{
scanf("%d", arr1 + i); // arr1+i等价于&arr1[i]
}
// 使用指针数组下标输出
for (int i = 0; i < sz; i++)
{
printf("%d ", p[i]); // p[i]等价于*(p+i)和arr1[i]
}
}
4. 冒泡排序函数实现
void bubble_turn(int arr1[], int sz)
{
for (int i = 0; i < sz - 1; i++) // 外层循环控制轮次
{
for (int j = 0; j < sz - 1 - i; j++) // 内层循环控制比较
{
if (arr1[j] > arr1[j + 1]) // 前大于后则交换
{
// 使用异或运算交换值(不借助临时变量)
arr1[j] = arr1[j] ^ arr1[j + 1];
arr1[j + 1] = arr1[j] ^ arr1[j + 1];
arr1[j] = arr1[j] ^ arr1[j + 1];
}
}
}
}
void print_arr(int arr[], int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]); // 打印数组元素
}
}
int main()
{
int arr1[] = { 1,4,6,7,2,5,9,3,8 };
int sz = sizeof(arr1) / sizeof(arr1[0]);
bubble_turn(arr1, sz); // 排序
print_arr(arr1, sz); // 打印
}
5. 二级指针的使用
int main()
{
int a = 0;
int* pa = &a; // 一级指针,指向a的地址
int** ppa = &pa; // 二级指针,指向pa的地址
printf("%d\n", a); // 直接访问
printf("%d\n", *pa); // 一级解引用
printf("%d\n", ‌**ppa);// 二级解引用(*ppa得到pa,**‌ppa得到a)
}
6. 指针数组的基本使用
int main()
{
int arr1[10] = { 0,1,2,3,4,5,6,7,8,9 };
int* parr1[10] = { &arr1[0] }; // 指针数组,初始化为arr1首地址
for (int i = 0; i < 10; i++)
{
parr1[i] = &arr1[i]; // 存储每个元素的地址
printf("&%d = ", *parr1[i]); // 解引用打印值
printf("parr1[%d]=%p\n", i, parr1[i]); // 打印地址
}
return 0;
}
7. 用指针数组模拟二维数组
int main()
{
int arr1[5] = { 0,1,2,3,4 };
int arr2[5] = { 1,2,3,4,5 };
int arr3[5] = { 2,3,4,5,6 };
// 指针数组存储三个一维数组的首地址
int* parr[3] = { arr1, arr2, arr3 };
// 模拟二维数组访问
for (int i = 0; i < 3; i++) // "行"
{
for (int j = 0; j < 5; j++) // "列"
{
printf("%d ", parr[i][j]); // 等价于*(parr[i]+j)
}
printf("\n");
}
}