数据类型:数据类型是固定内存大小的别名。 |
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"); } 切记:主调函数分配内存,被调函数使用,被调函数通过指针将结果甩出 |
内存四区与指针的分析
最新推荐文章于 2023-02-06 18:26:32 发布