Bootstrap

指针与字符串常量

指针与字符串常量

选择为真的表达式:

char str1[] = “abc”;

char str2[] = “abc”;

const char str3[] = “abc”;

const char str4[] = “abc”;

const char *str5 = “abc”;

const char *str6 = “abc”;

char *str7 = “abc”;

char *str8 = “abc”;

A、str1 == str2

B、str3 == str4

C、str5 == str6

D、str7 == str8

字符串常量:在C语言程序中,总有一对双引号将字符串常量扩起来,并且在内存中储存字符串常量时,必须在其末尾添加空字符‘\0’作为字符串结束标志,当储存在内存时,系统会自动添加结束标志符。

字符指针指向字符串:

1.字符指针变量赋值方式
例如:

char *p;
p="Hello world";

2.字符指针变量初始化方式

char *p = "Hello world";

注意这里赋值和初始化,并不代表将整个字符串存入字符指针变量中,其正确的含义是,首先将字符串常量存入内存的空闲区域中,然后将该字符串中首字符的地址赋给指针变量p。因为p是字符指针变量,所有只能存储字符的地址值。

什么时候指针和数组是相同的?

  • 1.“表达式中的数组名”就是指针
  • 2.C语言把数组的下标作为指针的偏移量
  • 3.“作为函数参数的数组名”等同于指针

数组和指针可交换的总结

  • 1.用a[i]这样的形式对数组进行访问总是被编译器“改写”或解释为像*(a+i)这样的指针访问。
  • 2.指针始终是指针。它绝不可能改写成数组。你可以用下标形式访问指针,一般都是指针作为函数参数时,而且实际传递给函数的是一个数组
  • 3.当作为函数的参数时,有个数组的声明可以看成一个指针。作为函数参数的数组始终会被编译器修改成为指定数组第一个元素的指针。
  • 4.因此当一个数组定义为函数的参数时,可以选择把它定义为一个数组,也可以定义指针。不管选择哪种方法,在函数内部事实上获得的就是一个指针。

但是需要注意的是,数组名虽然可以看成为一个指针,但是,它并不是一个指针变量,而是一个指针常量。

字符串的不可变性

不可变性:是指当一旦字符串被创建就不可再修改。

char s1="abc";
char s2="x";
s1=s1+s2;

此时输出s1为:

abcx

这是为什么呢?不是说不可变性吗?
其实,实际上储存“abc”的这内存并没有改变,只是在s1+s2是从新申请了一个内存来储存"abcx",然后将地址赋给了s1。
在这里插入图片描述

答案:CD是正确的,因为地址一样
AB不正确,地址不一样

;