C语言指针3

这一节类容:

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(arr0);

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 arr6;

整形指针:是数组,是存放整形的数组 int arr10;

指针数组:是数组,是存放指针的数组 int* arr5; 这个数组可以存放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* arr3 = {arr1,arr2,arr3};

int i = 0;

for(i = 0; i < 3; i++)

{

for(int j = 0; j < 5; j++)

{

printf("%d ",arrij);

}

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* p110; // 指针数组

int (*p2)10; // p2是数组指针变量

//p2指向的是数组,数组中有10个元素,每个元素的类型是int

int main()

{

int arr10 = {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 arr35,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 ",arrij);

}

printf("\n");

}

}

int main()

{

int arr35 = {{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 arr35 = {{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;

}

相关推荐
AndrewHZ4 小时前
【LLM技术全景】阶段总结:技术原理篇核心知识回顾
人工智能·深度学习·算法·语言模型·大模型·llm·芯片开发
小星星闪亮登场5 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
冻柠檬飞冰走茶5 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
玖玥拾6 小时前
LeetCode 88 合并两个有序数组
算法·leetcode
数据皮皮侠AI6 小时前
上市公司数字供应链金融指数(2010-2024)
大数据·人工智能·算法
stevenseahang6 小时前
C语言标准演化史:从K&R到GNU,谁才是正统?
c语言·gnu·可移植性·标准演化·ansic
2501_942389556 小时前
Epoch AI旗下FrontierMath的负责人Elliot Glazer
数据结构·决策树·动态规划·散列表
小程故事多_806 小时前
用GRPO算法重塑多智能体系统,从原理落地到复杂任务规划实战
人工智能·算法
别动我齐刘海7 小时前
Day6 unitree_G1人形机器人GMR—— MotionInput
c语言·c++·人工智能·学习·机器学习·机器人·github
Hi李耶7 小时前
【LeetCode】541.反转字符串 II
算法·leetcode·职场和发展