数组和指针真的不是一个东西

版权声明:如果不小心侵权了请及时说 会改的。祝大家看的开心同时也可以学到一点点东西 https://blog.csdn.net/zuoside__lord/article/details/81982099

这两天在写字符串方面的函数然后一如既往代码出bug在字符串常量与字符串变量上,好不容易 在错了很多次以后明白这两个真的不能混用以后,又看到一句话,这句话是引用,很多人都写过,就不一一标明了,反正不是我说的,喏。还是标明一下好,下面来自这个人类写得不错大家可以去看看

char *s1 = "hello";
char s2[] = "hello";


char *s1 的 s1 是指针,而指针是指向一块内存区域,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。
char s2[] 的 s2 是数组,对应着一块内存区域,其地址和容量在生命期里不会改变,只有数组的内容可以改变。
然后 s1=s2;是可以的。
s2=s1是不可以的。

---------下面是我碎碎唠叨大家可以直接跳过去看后面的结论或者链接,我这么懒直接点链接 看别人写好的就可以了

然后 我就执着于数组 指针,,一个是指向一块内存,一个是对应一块内存区域。一直以来,本宝宝都觉得这就是一个东西,然后就去搜索啊搜索啊,我看过数组的汇编 80*86就是一个地址 然后根据数组的大小往上加啊加啊,指针,,,汇编里似乎没有指针这个概念,一切都非常指针,还是去看看汇编,这句话似乎是对的,我只见过指针变量到处指,没有见过把数组名到处瞎用的最多就是修改下值。譬如 a[i++]=b[i++];放弃看汇编,太丑了,,64位的 还都是些 & %什么玩意据说这叫什么什么alter什么什么汇编,还都是16进制,,,我还要想。

——————————————

下面均来自 :虽然是拿c++举例但是瞅着还是像那么一回事儿

0 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命周期内保持不变,只有数组的内容可以改变。

  1      指针可以随时指向任意类型的内存块,它的特征是"可变",所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险

2 用运算符sizeof()可以看出数组的容量(字节数)。注意:当数组作为函数进行传递时,该数组自动退化为同类型的指针。

3指针参数是如何传递内存的?

        如果函数的参数是一个指针,不要指望用该指针去申请动态内存

……你们自己看去,我要再多看看,看百家之言。

这个人有的地方也写得也很不错 着重于http://blog.sina.com.cn/s/blog_8a1f055a0102vp9n.html

下面来自这个人类

eg. char a[]="hello word";

      char *p="happy";  

      a[1]='o';//OK

      p[1]='o';//error,原因后面红字体部分会解释   

      其中,a++不可以,因为a是表示数组首地址的常量,不能被修改,但可以p++指向字符串“happy”中的a.

 

你可能会有疑问,字符串“hello word”和字符串"happy"都是存储在静态存储区的字符常量,应该是不可以修改的呀,可是为什么数组的值可以修改呢?

注意:数组a中的值可以改变,是因为定义数组并初始化的时候,是从静态存储区把字符串复制给数组a,所以数组a的修改不会影响静态存储区中的静态常量的值。但是指针p指向的字符串"happy"的值不可以改变,因为指针p在定义初始化的时候是复制了字符串的地址复制给指针p,p指向的是静态存储区中的字符常量,如果修改p就会改变静态存储区中的值。

所以建议初始化一个指向字符串的指针时使用const修饰符。  eg.  const char *p="happy";这样字符串“happy”的值就不会被更改了(在编译层限制)

但,有一种方法可以更改指针的指向的字符串的值。

eg.    char *s;

         char p[]="AAA";

         s=p;

         *s='N';//OK

        因为此处s指向的不是静态存储区中的字符常量,而是数组初始化时复制的字符串。

 

eg.    char str1[]="abc";

          char str2[]="abc";

          char const str3[]="abc";

          char const str4[]="abc";

          数组str1,str2,str3和str4都是在栈中分配的,彼此不相等,如上面说的,是复制的静态存储区的字符常量“abc”,彼此独立。

eg.    char* str5="abc";

         char* str6="abc";

         const char* str7="abc";

         const char* str8="abc";

        指针str5,str6,str7和str8页同样是在栈中分配的,但是都指向静态存储区的字符常量“abc”,地址相同,所以str5=str6=str7=str8

就是写得让我想起java里深克隆和浅克隆,,,,本宝宝去试试 编译一下 真的如此。

虽然这些人已经写得很不错了,但是我还是要再看看 百家之言 最后拐到指针偏移量去了,,,,起码明白了一点点。关于字符串常量和字符串变量应该很清楚了

猜你喜欢

转载自blog.csdn.net/zuoside__lord/article/details/81982099
今日推荐