内存四区与指针的分析

来源:互联网 发布:tears and rain 知乎 编辑:程序博客网 时间:2024/06/05 23:03

数据类型:数据类型是固定内存大小的别名。

int a[10]={};

a的大小等于&a,但a+1的大小不等于&a+1,原因是数据类型不一样

变量变量是内存空间的标号

内存四区

堆区,栈区,全局(静态)和常量区,代码区

全局(静态)和常量区:如果两个字符串完全一样C++编译器只会定义一份

Strcmp(p1,p2)相当于java中的equals

在被调用函数里的临时区分配内存主调用函数是不能用的

char * getString()//运行错误提醒返回局部或临时变量

{

char buf[10];

strcpy(buf,"aasd");

return buf;

},返回已回收的内存空间地址

栈的开口向下,堆的开口向上,在栈区一次性分配buf[100] 地址是从下往上,因为生长方向与内存存放方向是两个不同概念

/对参数的指针类型应该怎么理解

//理解角度需要从两个角度出发

//站在c/c++编译器的角度 对形参,如果是指针类型,c编译器只会分配四个自己的内存。

////char *p7 形参 是变量

 

//指针的数据类型到底是什么

指针的数据类型是指它所指向的内存空间的数据类型

指针的数据类型具有依fu特性

结论:指针的步长,根据所指内存空间类型来定。

char 型一次跳一个字节,int 型一次跳4个字节

 

void senddata01(char    *p1); void senddata01(char*            p1);

void senddata02(char **    p1); void senddata02(char *     *p1);  void senddata02(char         **p1);

void senddata03(char ***p1);

void senddata04(char *p[]); void senddata04(char *     p[]);  void senddata04(char *p    []);

void senddata05(char (*p)[10]); void senddata05(char (*p)             [10]);

void senddata05(char *****p4);

char *p ="sss";

*p = 'a';  //报错,因为sss在常量区不可以修改

在全局区Int a = 10 其中10是字面量,存放在不是堆栈,全局区的区域,不能取地址,可以理解为代码区之类的区域 

不可以通过函数出传参改变指针变量的值(即指针的指向),但可以改变指针变量所指向的值

//因为后缀++的优先级,高于,*p;

void copy_str4(char *from , char *to)

{

while((*to ++ = *from++) != '\0')

{

;

}

}

Char类型在实参赋值给形参的时候会隐式类型转换为int

int  copy_str2(char *from , char *to)

{

int ret = 0;

if (from ==NULL || to== NULL)

{

ret = -1;

printf("func copy_str2() err: %d, (from ==NULL || to== NULL)", ret);

return ret;

}

for (; *from!='\0'; from ++, to++ )

{

*to = *from;

}

*to = '\0';

return ret;

}

void main1()

{

int rv = 0;

char from[100] = {0};

char to[100] = {0};

strcpy(from, "fromabc");

rv = copy_str2(from, to);

if (rv != 0)

{

printf("func copy_str2:%d", rv);

return ;

}

 

printf("%s", to);

system("pause");

}

不同于

void main1()

{

int rv = 0;

char *from = {0};

char *to = {0}; //没有分配内存

strcpy(from, "fromabc");

rv = copy_str2(from, to);

if (rv != 0)

{

printf("func copy_str2:%d", rv);

return ;

}

 

printf("%s", to);

system("pause");

}

切记:主调函数分配内存,被调函数使用,被调函数通过指针将结果甩出

0 0