黑马程序员技术交流社区

标题: 请问数组和指针有什么区别吗? [打印本页]

作者: 光辉岁月    时间: 2014-5-28 23:09
标题: 请问数组和指针有什么区别吗?
本帖最后由 光辉岁月 于 2014-5-29 09:23 编辑

请问数组和指针有什么区别吗?
比如:

char str1[] = "abcdef";
char *str2 = "abcdef";

他们用起来不都是一样的吗?
作者: 522049094    时间: 2014-5-28 23:21
我记得李明杰老师讲的视频里面讲的是,数组用来操作字符串是可以修改的,字符串中的元素是不能修改的。更加高深的我就不太会了,坐等楼下大神
作者: 永远不会贬值    时间: 2014-5-28 23:23
char str1[] = "abcdef";  是字符串变量,存储在内存的栈中,可以修改字符串里的字符
例如str1[2] = 'd';
printf("%s",str);  // 输出的结果就是 abddef
char *str2 = "abcdef";   是字符串常量,存储在内存的常量区,不可以修改,

作者: XCodeRush    时间: 2014-5-29 00:25
回答:主要的区别在于数组名str1是个常量,而指针str2是个变量.
数组元素是变量,但数组名str1不是变量。
str2是指针,指针是变量,但str2中并不是存储字符串,而是存储字符串的地址。
用一个程序给你解释一下:

  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(void)
  4. {
  5.     char str1[] = "abcdef";
  6.     char *str2 = "abcdef";
  7.    
  8.     // 首先他们都可以使用[]遍历字符串中的所有元素
  9.     // 用数组符号[]循环输出str1中的每个元素
  10.     for (int i = 0; i < strlen(str1); i++) {
  11.         putchar(str1[i]);
  12.     }
  13.     putchar('\n');
  14.     // 用数组符号[]循环输出str2中的每个元素
  15.     for (int i = 0; i < strlen(str2); i++) {
  16.         putchar(str2[i]);
  17.     }
  18.     putchar('\n');
  19.    
  20.     // str1和str2都可以使用指针加法
  21.     // 用指针加法循环输出str1中的每个元素
  22.     for (int i = 0; i < strlen(str1); i++) {
  23.         putchar(*(str1 + i));
  24.     }
  25.     putchar('\n');
  26.     // 用指针加法循环输出str2中的每个元素
  27.     for (int i = 0; i < strlen(str2); i++) {
  28.         putchar(*(str2 + i));
  29.     }
  30.     putchar('\n');
  31.    
  32.     // 可以改变str1中的元素
  33.     str1[0] = 'A';
  34.     // 不可以改变str1的值,因为他是常量
  35.     // str1 = str2; // 错误用法
  36.    
  37.     // 不可以改变str2所指向字符串中的元素
  38.     // 因为此时str2所指向的字符串存储在程序用来存放常量的那部分内存中
  39.     // str2[0] = 'A';   // 错误用法
  40.     // 建议初始化一个指向字符串常量的指针时使用const修饰符
  41.     const char * str3 = "abcdef";
  42.     // str3[0] = 'A';   // 此时编译器会报错
  43.     // 可以改变str2的值,因为他是指针,指针是变量
  44.     str2 = str1;    // 此时指针str2指向str1数组的首元素

  45.     return 0;
  46. }
复制代码


作者: 光辉岁月    时间: 2014-5-29 09:23
XCodeRush 发表于 2014-5-29 00:25
回答:主要的区别在于数组名str1是个常量,而指针str2是个变量.
数组元素是变量,但数组名str1不是变量。
...

回答的太仔细了吧{:3_53:}
作者: 天空角落    时间: 2014-5-29 09:46
学习啦{:3_53:}
作者: an1911    时间: 2014-5-29 10:41
学习学习
作者: 李斌007    时间: 2014-5-29 10:45
学习学习




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2