这一节类容:
1、字符指针变量
2、数组指针变量
3、二维数组传参的本质
4、函数指针变量
5、函数指针数组
6、转移表
冒泡排序
冒泡排序的核心思想就是:两两相邻的元素进行比较之后排序
int main()
{
int arr[] = {2,4,5,3,6,7,9,8,10,1};
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz);
print_arr(arr,sz);
return 0;
}
多级指针
int main()
{
int a = 10;
int* pa = &a; //一级指针
int** ppa = &pa; //二级指针
**ppa = 100;
printf("a = %d\n",a);
return 0;
}
指针数组
先回顾一下
类比
字符指针:是数组,是存放字符的数组 char arr[6];
整形指针:是数组,是存放整形的数组 int arr[10];
指针数组:是数组,是存放指针的数组 int* arr[5]; 这个数组可以存放5个整形数据的地址
指针数组模拟二维数组
int main()
{
int arr1[] = {1,2,3,4,5};
int arr2[] = {2,3,4,5,6};
int arr3[] = {3,4,5,6,7};
int* arr[3] = {arr1,arr2,arr3};
int i = 0;
for(i = 0; i < 3; i++)
{
for(int j = 0; j < 5; j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
1、字符指针变量
int main()
{
const char* p = "abcdef"; // abcdef常量字符串不能被修改
//代码的意思是 把 abcdef 字符串的首字符的地址存放在p中
printf("%c\n",*p); //a
printf("%s\n",p); //abcdef
return 0;
}
注意 有const时,内容相同开辟的就是同一块空间,没有const时,即使内容相同,开辟的空间不一定相同
int main()
{
char str1[] = "hello bit.";
char str2[] = "hello bit.";
const char* str3 = "hello bit.";
const char* str4 = "hello bit.";
if(str1 == str2)
{
printf("str1 and str2 are same\n");
}
else
{
printf("str1 and str2 are not same\n");
}
if(str3 == str4)
{
printf("str3 and str4 are same\n");
}
else
{
printf("str3 and str4 are not same\n");
}
return 0;
}
2、数组指针
类比
字符指针变量:是指向字符的指针变量,可以存放字符变量的地址
整形指针变量:是指向整形的指针变量,可以存放整形变量的地址
数组指针变量:是指向数组的指针变量,可以存放数组的地址
int* p1[10]; // 指针数组
int (*p2)[10]; // p2是数组指针变量
//p2指向的是数组,数组中有10个元素,每个元素的类型是int
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int (*p)[10] = &arr;
int i = 0;
for(i = 0; i < 10; i++)
{
printf("%d ",(*p)[i]);
}
return 0;
}
3、二维数组传参的本质
以前二维数组是这么写的
void printf(int arr[3][5],int r,int c)
{
int i = 0;
int j = 0;
for(int i = 0; i < r; i++)
{
for(int j = 0; j < c; j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5] = {{1,2,3,4,5},{2,3,4,5,6}.{3,4,5,6,7}};
printf(arr,3,5);
return 0;
}
用指针写
void printf(int (*arr)[5],int r,int c)
{
int i = 0;
int j = 0;
for(int i = 0; i < r; i++)
{
for(int j = 0; j < c; j++)
{
printf("%d ",*(*(arr + i) + j));
}
printf("\n");
}
}
int main()
{
int arr[3][5] = {{1,2,3,4,5},{2,3,4,5,6}.{3,4,5,6,7}};
printf(arr,3,5);
return 0;
}
4、函数指针变量
数组指针变量:是指向数组的指针变量
函数指针变量:指向函数的指针变量
函数指针变量的使用:通过函数指针调用指针指向的函数
int (*p)(int x);
//p 函数指针变量名
int Add(int x,int y)
{
return x + y;
}
int main()
{
int (*pf)(int,int) = Add;
//int (*pf)(int,int) = &Add;
//取不取地址都可以
int r = pf(3,6);
printft("%d\n",r);
return 0;
}