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++中会使用到。