关于字符串数组,字符串指针(C语言)
2017-12-01 16:35
344 查看
字符串数组,字符串指针的区别。
字符串数组:如
首先在内存字符常量区分配一块内存空间放下”abcd\0”,然后在栈中分配一块连续的内存空间,将字符常量区的”abcd\0”复制到栈中。所以,字符串数组的头指针buf所指向的字符串首地址在栈中,故是可以进行读写操作的。
字符串指针:如
首先还是在内存字符常量区分配一块内存空间放下”abcd\0”,并将字符常量区”abcd”的首地址赋给指针ptr。所以ptr指针本身分配在栈中,而它所指向的字符串首地址是在文字常量区,故只能够读,不能够写。
(字符串指针还有一种情况是
首先在堆区分配一块长度为5的内存空间,首地址赋给ptr,接着还是在内存字符常量区分配一块内存空间放下”abcd\0”,然后把文字常量区中的”abcd\0”复制到堆中。此时ptr指针本身在栈中,它所指向的字符串首地址在堆中,所以也可以进行读写操作。
最后的结果是p1,p2指向同一个地址,并且能够正常显示出”ac”,
而p3却显示错误。
原因就是p1指针指向的是文字常量区,并且返回的值文字常量区的地址,
p1本身的地址是被弹栈了,但是它所指向的地址,还是存在的,
至于为什么地址相同,是因为指针指向的都是文字常量区同一个字符串地址。
而func_1()使用的是一个字符串数组,是在栈中开辟空间来存放ac和‘\0’的,函数一旦调用结束,就会释放这个函数的栈区空间,再返回他的地址,所对应的内容,就会出错。
字符串数组:如
char buf[] = "abcd";
首先在内存字符常量区分配一块内存空间放下”abcd\0”,然后在栈中分配一块连续的内存空间,将字符常量区的”abcd\0”复制到栈中。所以,字符串数组的头指针buf所指向的字符串首地址在栈中,故是可以进行读写操作的。
字符串指针:如
char * ptr = "abcd";
首先还是在内存字符常量区分配一块内存空间放下”abcd\0”,并将字符常量区”abcd”的首地址赋给指针ptr。所以ptr指针本身分配在栈中,而它所指向的字符串首地址是在文字常量区,故只能够读,不能够写。
(字符串指针还有一种情况是
char * ptr = (char *)malloc(5 * sizeof(char));
strcpy(ptr, "abcd");
首先在堆区分配一块长度为5的内存空间,首地址赋给ptr,接着还是在内存字符常量区分配一块内存空间放下”abcd\0”,然后把文字常量区中的”abcd\0”复制到堆中。此时ptr指针本身在栈中,它所指向的字符串首地址在堆中,所以也可以进行读写操作。
所以像下面这种情况就不难理解了
char * getstring1() { char * p1 = "ac"; return p1; } char * getstring2() { char * p2 = "ac"; return p2; } char * func_1() { char buff[3] = "ac"; return buff; } int main() { char * p1 = getstring1(); char * p2 = getstring2(); char * p3 = func_1(); printf("%d %s\n", p1, p1); printf("%d %s\n", p2, p2); printf("%d %s\n", p3, p3); getch(); return 0; }
最后的结果是p1,p2指向同一个地址,并且能够正常显示出”ac”,
而p3却显示错误。
原因就是p1指针指向的是文字常量区,并且返回的值文字常量区的地址,
p1本身的地址是被弹栈了,但是它所指向的地址,还是存在的,
至于为什么地址相同,是因为指针指向的都是文字常量区同一个字符串地址。
而func_1()使用的是一个字符串数组,是在栈中开辟空间来存放ac和‘\0’的,函数一旦调用结束,就会释放这个函数的栈区空间,再返回他的地址,所对应的内容,就会出错。
相关文章推荐
- c语言中关于字符串的那些事儿(字符数组和字符指针)
- 关于c语言中的字符数组和字符串指针
- 关于C语言字符数组、字符串和指针的相关问题
- C语言中关于数组与指针和字符串与指针的小结
- 有趣的C语言--字符串与数组和指针的秘密
- C语言 第 7 节 如何将字符串指针指向的内容赋值给数组
- C语言中字符数组和字符串指针分析
- C语言字符串指针与字符数组的区别
- 【错误记录】关于C语言指针和数组
- 关于C语言数组利用指针排序的问题
- 黑马程序员——C语言之字符串指针与二维字符串数组
- 11、C语言中字符数组和指针字符串的指针变量
- 关于C语言中的字符指针和字符数组
- C语言中字符数组和字符串指针分析
- Swift中对C语言接口缓存的使用以及数组、字符串转为指针类型的方法
- c语言中字符串常见初始化时的问题,以及字符串数组与指针区别的分析
- 关于数组指针,指针数组,双重数组,二维矩阵,字符串数组,双重字符指针的理解
- C语言字符串、数组与指针结合
- C语言中字符数组和字符串指针分析
- 关于数组与指针的应用及区别-针对字符串去左边多余的‘0’字符