前言
通过对前面指针的学习,你可能对指针有了一些理解,比如,数字名的理解,然后怎么使用指针来访问数组,二级指针,指针数组 …
有了这些的理解,本小节我们继续深入理解指针,啊森将会带你理解字符指针变量,数组指针变量,二维数组传参的本质,函数指针变量和函数指针数组,通过这些学习,我们最后来通过这些知识来实现转移表,话不多说,让我们启航!
一、🚣 字符指针变量
在C语言中,字符指针变量是一种指向字符型数据的指针变量。它可以用来指向一个字符数组的首地址,也可以用来指向一个字符型变量的地址。
指针类型为字符指针 char*
字符指针变量的声明和初始化如下所示:
char str[] = "Hello"; // 声明一个字符数组 char *ptr; // 声明一个字符指针变量 ptr = str; // 将字符数组的首地址赋给字符指针变量
通过字符指针变量可以访问和操作字符数组中的元素,也可以通过指针运算来访问字符串中的字符。例如:
int main() { char str[] = "Hello"; char* ptr; ptr = str; printf("%c\n", *ptr); // 输出字符数组的第一个字符 printf("%c\n", *(ptr + 1)); // 输出字符数组的第二个字符 return 0; }
当然,以上是把字符串放在字符数组里面,不过我们可不可以把字符串直接放在指针里面呢?当然可以!
int main() { const char* pa = "hello,world";//这⾥是把⼀个字符串放到pa指针变量⾥了吗? printf("%s\n", pa); return 0; }
思考:这⾥是把⼀个字符串放到pa指针变量⾥了吗?
当然不是!
–>代码 const char* pa = "hello,world"; 特别容易让同学以为是把字符串 hello,world 放
到字符指针 pa ⾥了,但是本质是把字符串 hello,world. ⾸字符的地址放到了pa中。
这个是内存布局,"hello,world"是一个字符串常量,它的值存储在内存中,而pa是一个指向这个字符串常量的指针,它的值是字符串常量的地址。所以pa存储的值是104,也就是"hello,world"的第一个字符的ASCII码值,以此我们就可以通过第一个字符串常量的地址遍历后面的字符,顺藤摸瓜的找到字符"\0"才停止。
总结:代码的意思是把⼀个常量字符串的⾸字符 h 的地址存放到指针变量 pa 中。
《剑指Offer》中收录了一道和字符串相关的笔试题,让我们一起来学习一下:
#include <stdio.h> 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; }
这个代码打印结果不一样的原因是:
str1 和 str2 是字符数组,它们分别用"hello bit."初始化了两个不同的数组。虽然内容相同,但它们占用的内存地址是不同的,所以str1 == str2 判断为不相等,打印"str1 and str2 are not same"。
str3 和 str4 是字符指针,它们都指向同一个字符串常量"hello bit."。字符串常量存储在只读内存区域,无论如何定义,它们的地址是相同的。所以str3 == str4 判断为相等,打印"str3 and str4 are same"。
换句话说:
- 字符数组比较地址,地址不同就不相等。
- 字符串常量比较内容,内容相同就相等。
所以结果不同的原因是str1、str2是数组,str3、str4是指针,它们的比较规则不同。
如果将str3和str4也定义为字符数组,则它们的比较结果也会是不相等,打印"str3 and str4 are not same"。
【C语言】深入解开指针(四)2:https://developer.aliyun.com/article/1474726