黑马程序员技术交流社区
标题:
请问数组和指针有什么区别吗?
[打印本页]
作者:
光辉岁月
时间:
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中并不是存储字符串,而是存储字符串的地址。
用一个程序给你解释一下:
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[] = "abcdef";
char *str2 = "abcdef";
// 首先他们都可以使用[]遍历字符串中的所有元素
// 用数组符号[]循环输出str1中的每个元素
for (int i = 0; i < strlen(str1); i++) {
putchar(str1[i]);
}
putchar('\n');
// 用数组符号[]循环输出str2中的每个元素
for (int i = 0; i < strlen(str2); i++) {
putchar(str2[i]);
}
putchar('\n');
// str1和str2都可以使用指针加法
// 用指针加法循环输出str1中的每个元素
for (int i = 0; i < strlen(str1); i++) {
putchar(*(str1 + i));
}
putchar('\n');
// 用指针加法循环输出str2中的每个元素
for (int i = 0; i < strlen(str2); i++) {
putchar(*(str2 + i));
}
putchar('\n');
// 可以改变str1中的元素
str1[0] = 'A';
// 不可以改变str1的值,因为他是常量
// str1 = str2; // 错误用法
// 不可以改变str2所指向字符串中的元素
// 因为此时str2所指向的字符串存储在程序用来存放常量的那部分内存中
// str2[0] = 'A'; // 错误用法
// 建议初始化一个指向字符串常量的指针时使用const修饰符
const char * str3 = "abcdef";
// str3[0] = 'A'; // 此时编译器会报错
// 可以改变str2的值,因为他是指针,指针是变量
str2 = str1; // 此时指针str2指向str1数组的首元素
return 0;
}
复制代码
作者:
光辉岁月
时间:
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