对于指针,到此处的读者对于都有着不少的独自认识与了解!因此,笔者也不敢托大!作为一个浅浅的小白,写篇指针的进阶,来祈祷大佬的指教!
首先,笔者先对指针进行初步回顾一下!
1.指针就是变量,用来存放地址,地址唯一标识的一块内存空间!
2.指针的大小是固定的4/8个字节(32位平台/64位平台)!
3.指针是有类型,指针的类型决定了指针走一步(+,-)整数的步长!指针解引用操作的时候的权限!
4.指针的运算!
下面步入正题:
1.字符指针:char * 类型
char ch = 'W';
char* pc = &ch;
这段是我们所熟悉的!但是对于再字符串指针中:
#include <stdio.h> int main() { char* ps = "abcdef"; printf("%c\n", *ps); return 0; }
而最后的打印结果为:a
对于打印结果,不少人有着疑惑,但结果确实是这样的!
在这里面 char* ps = "abcdef",仅仅是将 字符串的首地址(a的地址)传递给了指针ps;
并不是将abcdef存放到ps里面,而是存放的a的地址!因此再printf("");语句里面,对其解引用,得到的结果为a ;
2.在上述代码中: char* ps = "abcdef"; 为字符串常量,
下面笔者对上述代码段进行简单更改!
#include <stdio.h> int main() { char* ps = "abcdef"; ps = 'w'; printf("%c\n", *ps); return 0; }
然而最后的打印结果为:什么都不打印!!!
是滴!我没有说错,你也没有看错!最后的打印结果确实为:什么都没有!!!
主要原因为:字符串常量不可修改!
#include <stdio.h> int main() { char* ps = "abcdef"; printf("%s\n", ps); return 0; }
对于上述代码,与第一个代码不同的是在于printf(""); 语句里面的%s; %s:打印字符串,而打印字符串只需要知道起始位置就可以,而ps里面放的是‘a'的地址!则可以顺序打印出来abcdef;
因此最后的打印结果为: abcdef
3.字符串的比较
#include <stdio.h> int main() { char ch1[] = "hello jiyuan"; char ch2[] = "hello jiyuan"; const char* ch3[] = "hello jiyuan"; const char* ch4[] = "hello jiyuan"; if (ch1 == ch2) { printf("相同\n"); } else { printf("不相同\n"); } if (ch3 == ch4) { printf("相同\n"); } else { printf("不相同\n"); } return 0; }
在上述代码中,笔者首先定义了两个数组: ch1[], ch2[]; 在这两个数组里面,输入的字符串是一样的,但是再内存中,开辟了两个地址来存放这两个字符串,因此地址是不一样的!
然后笔者定义了两个:const char* 类型的字符串: ch3[], ch4[];里面存放着相同的字符串,常量字符串不能修改!则,存放ch3[] 与存放ch4[] 元素的地址相同!
然而,在下方if语句里面,咋一看吓到了不少人,但是,数组名是数组首元素的地址!所以,在if语句里面比较的是:地址!
所以最后的结果显而易见!
如果读者想比较字符串的内容,则可以使用库函数:strcmp();
即:ch1[] 与 ch2[] 一样 ; ch3[] 与 ch4[] 一样!在此笔者就不做过多的讲述!