一问题背景:

 在用数组打印字符串的时候我们可以发现,这个时候是不用解引用的,但是在打印数组元素的时候,我们却要解引用,arr1[1]哪里解引用了呢,其实arr1[1]等价于*[arr+1].

字符串数组打印java printf打印字符串数组_数组

  二 在我搜集资料中,我还产生了如下两个问题

     (1)char*p="bite"这种形式的意思。

"bite"就是表示一个地址,而且是首元素b的地址,如果此时用%c打印解引用后的字符串,结果会出现b。

字符串数组打印java printf打印字符串数组_c语言_02

 当然如果是个‘b’这就是个字符,而不是字符串,更不会被当成数组,也就没有表示一个地址的这种说法。

(2)初始化数组可以用字符串赋值,其它情况属于什么?

初始化数组的时候是把字符串拷贝到数组中去,数也就是说这个时候内存中有两份字符串。可通过两份字符串地址验证:

字符串数组打印java printf打印字符串数组_数组_03

 此时arr数组对应的地址与指针变量p对应的地址不同,这说明内存中有两份字符串。

但如果是其它情况下如arr="byte",这时候等号左边表示数组首元素地址是个常量,现在要这个地址等于指向字符串的地址,这不合标准。

为什么打印字符串可以不用解引用呢,而打印整形数组,字符数组就要解引用,目前来说应该是%s这个符号的作用,它让printf可以找到字符串的位置并将其打印,也可以从设计上理解,字符串有结束标志\0,整型数组没有,连续打印是会出问题的。还有就是打印变量貌似没有解引用这个说法,变量名在计算机中算什么呢?首先代码转为机械代码的时候没有保存变量名,却又能通过变量名找到内存空间,我查资料得出的解释是:编译器会把变量名以及它代表的地址保存到符号表,所以当下面代码printf库函数用到这个变量的时候,编译器都会通过符号表的地址找到内存空间的数据,然后传给printf。(这些知识我感觉应该已经有点偏了,我们了解了解就好了,还是那句话,深究就到沟里了)

字符串数组打印java printf打印字符串数组_c语言_04