☰
学习嵌入式Day13:C语言之指针
2026/10/1 20:03:11 网站建设 项目流程

补充:

1.如果定义多个指针变量

int *p,*q,*r; // p、q、r全部都是int指针 int a,b,c,*p,*q; // a,b是普通整型变量;p,q才是指针
int *p;

这里的 * 是修饰符,修饰后面的变量p,代表p是指针变量。存放int类型变量的地址。

*p = &a;

这里的 * 是运算符,取地址运算。

2.野指针:指针变量未初始化,变量中是随机值,指针没有明确的指向

3.NULL空地址:为了避免野指针,定义指针时,在没有确定指向的时候,赋值为NULL。

int *p = NULL;

4.void * 空类型指针(万能指针)

一、指针中的排序和查找算法

1.选择排序

void selectSort(int *begin, int *end) { int *p; for (; begin < end; ++begin) { for(p = begin+1; p <= end; ++p) { if(*p < *begin) { swap(p, begin); } } } }

2.冒泡排序

void bubbleSort(int *begin, int *end) { int *p; for (end; end > begin; --end) { for(p = begin; p < end; ++p) { if(*(p+1) < *p) { swap(p+1, p); } } } }

3.插入排序

void insertSort(int *begin, int *end) { int *p = begin; int *q = NULL; for (; p <= end; ++p) { int t = *p; q = p; while (q > begin && *(q-1) > t) { *q = *(q-1); --q; } *q = t; } }

4.快速排序

分治法步骤:

1.选择基准值

2.从右往左找到第一个比基准值小的值,标记为end

3.从左往右找到第一个比基准值大的值,标记为begin

4.交换end标记的值和begin标记的值

5.重复2~4,直到end和begin相遇

6.相遇时,将相遇位置上的值和基准位置上的值交换

7.比基准值小的部分和比基准值大的部分分别继续重复1~7(递归)

void quickSort(int *begin, int *end) { //递归结束条件 if (begin >= end) { return; } //记录初始位置 int *p = begin; int *q = end; //1.确认基准值(首元素) int *k = begin; while(begin < end)//5.判断end和begin是否相遇 { //2.从右向左遍历,找到第一个比基准值大的值,标记为end while (*k <= *end && end > begin) { --end; } //3.从左向右遍历,找到第一个比基准值小的值,标记为begin while (*k >= *begin && end > begin) { ++begin; } //4.交换end和begin标记的值 swap(begin, end); //重复 } //将end和begin相遇时的值和基准值进行交换,左边都是比基准值小的值,右边都是比基准值大的值 swap(begin, k); //在比基准值小的部分继续进行快速排序 quickSort(p, end-1); //在比基准值大的部分继续进行快速排序 quickSort(begin+1, q); }

5.二分查找

int *binaryFind(int *begin, int *end, int n) { int *mid; while (begin <= end) { mid = begin + (end - begin)/2; if (*mid > n) { end = mid - 1; }else if (*mid < n) { begin = mid + 1; }else { break; } } if (end < begin) { return NULL; }else { return mid; } } //递归 int * binaryFindR(int *begin, int *end, int n) { if(begin > end) { return NULL; } int *mid = begin + (end - begin)/2; if (*mid > n) { end = mid - 1; return binaryFindR(begin, end, n); }else if (*mid < n) { begin = mid + 1; return binaryFindR(begin, end, n); }else { return mid; } }

二、指针操作字符型数组

char s[] = "hello"; //操作字符串

字符串是一种特殊的字符型一维数组,末尾带'\0'结束标记。
指针操作s中的数据,需要获得首元素地址

s[0] //char类型 &s[0] //char * char *p = s;//等价于char *p = &s[0];

const和指针

int puts(const char *s);

const表示将所修饰的变量,限定为只读,遵循就近原则 ,离谁近,就限定谁。

如果函数只是读取字符串 / 数组数据,不修改内容,参数就加const。

好处:编译阶段就能发现非法修改;兼容性更强,可以接收 char*、数组名、字符串常量;提高函数的适用性。

const int a; //这个a此时只读 const char * p; //限定通过*p方式访问基类型 为 只读 ,不能修改基类型 char const * p; //限定通过*p方式访问基类型 为 只读 char * const p; //限定p本身为只读 表示p本身不能被修改 const char * const p; //p不能被修改 *p也不能被修改

表示字符串的方式

char s[] = "hello"; //使用栈空间上的 字符串 char *s = "hello"; //使用字符串常量区中字符串 const char *s = "hello"; //更准确
char *strcpy(char *dest, char *src); char *strcpy(char *dest, const char *src);

目标地址 dest 内容需要修改,不加 const;源字符串 src 只读取,添加 const 保护。

三、总结

指针可以直接操作内存地址,配合数组、字符串、排序算法一起使用,是入门阶段最大的难点。很多人觉得指针难,本质是它非常抽象,还能和前面学的变量、数组、函数全部串联起来。对于函数的这一块,取地址和取值运算还要继续加强。

明天是国庆节,国庆节快乐!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询