您的位置:首页 > 编程语言 > C语言/C++

C语言提高_01

2017-12-07 22:37 155 查看
1.c语言中数组的地址是数组取地址(&)

例如:int a[];     打印a和&a结果是相同的。但是打印a+1和&a+1结果就不同了,&a+1是跳过整个数组大小到下一个地址。

2.c应用开启的时候,系统会开辟四块内存区域:堆区 ,栈区,全局区(静态区,常量区),方法区



下面举例子说明:



字符串常量是在全局区中的,也就是当函数出栈的时候,字符串常量没有被析构掉,可以正常使用。

经电话语:指针指向谁就吧谁的地址赋值给指针。指针变量和他指向的内存空间变量是两个不同的概念。

上述中的两个函数中的局部变量指针指向的 都是一个字符串地址,如果这个两个字符串相同,c++编译器会做代码优化处理只会保留一份。所有说打印的地址是通过的。

栈的生长方向和buf的生长方向是两个不同的概念。

3. 指针的强化

指针也是一种数据类型,有内存大小,可以赋值。
*p放在等号的左边   写内存
*p放在等号的右边   读内存。
常量区的内存不能通过指针去修改,不然会报错。例如:char * p=“alsdkfj”;  *(p+2)=M;就会报错。   p为字符串的首地址,+2的话就到了第三个地址的位置。
野指针是指针指向了一块被回收的内存空间。一般free后,需要对指针进行赋NULL操作。

4.通过指针间接赋值的意义

再函数调用的时候,形参传给实参,用实参取地址,传给形参,在被调用函数里面用*p,来改变实参,把运算结果传出去。
指针作为函数参数的精髓,c语言的特有现象,c语言的精华

void getdata(int* n,char** m)
{
int q=0;
char* w=NULL;
w=(char*)malloc(100);
strcpy(w,"assdfggghgh");

*m=w;
*n=strlen(w);
}
int main(void)
{
int a=0;
char* b=NULL;
getdata(&a,&b);

}
这里a和b就是入参出参,在两个函数中都可以操作同一块内存,实现逻辑的分层处理。

间接赋值成立的三个条件:
1. 定义1一个变量(实参)    定义一个变量(形参)
2. 建立关联:把实参取地址传给形参
3.形参去间接的修改实参的值。
使用场景:
1 2 3条件写在一个函数中
12写在一块,3单独写在另一个函数中
1          23写在一块,,,,在C++中会使用到。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: