c语言中 *和[]的讨论
1.声明定义与内存分配
1.1一个由c/C++编译的程序占用的内存分为以下几个部分
(1)栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。
(2)堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
(3)全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
(4)文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。
(5)程序代码区
1.2
通过*声明的话是将指针存放在栈区域,具体指针指向的值可以在常量区,全局区或者堆上。
通过[]声明的话是将整个数组存放在栈区域,并且声明变量指向自身,即数组的第一个元素。
看一个一维数组的例子
#include <iostream>using namespace std;main(){ char *c1 = "abc"; char c2[] = "abc"; char *c3 = ( char* )malloc(3); // *c3 = "abc" //error strcpy(c3,"abc"); c3[0] = 'g'; printf("%d %d %s\n",&c1,c1,c1); printf("%d %d %s\n",&c2,c2,c2); printf("%d %d %s\n",&c3,c3,c3); getchar();} #include <stdio.h>int main(){char x[][2]={'1','2','3','4'};printf("%c",*((char*)x));printf("%c",*((char*)x+1));printf("%c",*((char*)x+2));printf("%c",*((char*)x+3));}