路漫漫其修远兮,武将上下而求索;
以例子为导向来分析字符指针的中存的是什么,以及常量字符串在内存中是如何存储的。
想要详细地了解指针的概念可以戳此链接(详细的万字讲解):
顾名思义,字符指针就是指针变量指向的对象是字符类型,即指针变量的类型为 char* ;
单个字符的指针创建,代码如下:
#include<stdio.h>
int main()
{
char ch = 'a';
char* p = &ch;//此*代表着变量p 为指针变量
*p = 'b';
return 0;
}
先来看一下整型的例子:
int a = 10 ;
int b = a + 2;
"a+2" 是一个表达式的话,那么此表达式就一定有自己的值,然后再将此值赋给b ;
注:表达式有两个属性:值属性 和 类型属性
即 "a+2" 的结果为12,那么12就为其值属性;2 为int 类型,变量a 为int 类型,那么 "a+2"此表达式 的类型为int 类型。
eg. char * p = "abcdefg" ;
若将字符串"abcdefg"当作表达式,那么将它赋给指针变量p 的是什么呢?
我们来看一下打印字符串,代码如下:
#include<stdio.h>
int main()
{
char ch[10] = "abcdefg";
char* p = "abcdefg";
char* p1 = ch; //将数组的首元素地址存放起来
printf("%s\n", "abcdefg");
printf("%s\n", ch);
printf("%s\n", p);
printf("%s\n", p1);
printf("字符串地址=%p\n", "abcdefg");
printf("指针p中存放的地址=%p\n", p);
printf("指针p1中存放的地址=%p\n", p1);
return 0;
}
代码运行结果如下:
分析:字符串的创建是用字符数组创建的,我们打印字符串一般采用 printf("%s\n", "abcdefg"); 这种方式,或者将字符串存在数组中,然后对此数组进行打印,即printf("%s\n",ch);
我们将以上的代码又运行了一次:
注:const 修饰指针变量:(eg. char* p = "abcdefg"; )
1、当 const 放在 * 的左边,有两中写法:
- 一是 const char* p = "abcdefg";
- 二是 char const * p = "abcdefg";
表示 *p 即指针变量p 指向的对象,const 修饰指针p指向的对象也就是说指针p 指向的对象是常变量,即指针p 指向的对象不可被修改;
2、当const 放在* 的右边,写作:
- char* const p = "abcdefg";
字符指针有两种的表示形式:
1、const 不修饰
2、const 修饰
我们按照例子来分析:
#include<stdio.h>
int main()
{
const char* p1 = "abcdef";
const char* p2 = "abcdef";
char arr1[] = "abcdef";
char arr2[] = "abcdef";
if (p1 == p2)
printf("p1==p2\n");
else
printf("p1!=p2\n");
if (arr1 == arr2)
printf("arr1==arr2");
else
printf("arr1!=arr2");
return 0;
}
代码运行结果:
分析:常量字符串 ”abcdef“ 存放在内存中的常量区,常量区只能读取而不能对其进行修改;
为什么常量字符串存在常量区?
1、字符指针就是指针变量指向的对象是字符类型,即指针变量的类型为 char* ;
3、常量字符串存放在内存中的常量区,常量区中的数据只能读取而不能被修改。
因篇幅问题不能全部显示,请点此查看更多更全内容