商城网站优化方案,360网站上做宣传要多少钱,qq免费搭建网站,制作网站要不要域名C语言中有指针概念#xff0c;非常抽象灵魂#xff0c;想要完全掌握他不是意见容易的事#xff0c;结合这几天的学习进行一个总结。
一、什么是指针#xff1a;指针实际就是地址#xff0c;#xff08;指针地址#xff09;#xff0c;地址就是具体的位置信息。
二、…C语言中有指针概念非常抽象灵魂想要完全掌握他不是意见容易的事结合这几天的学习进行一个总结。
一、什么是指针指针实际就是地址指针地址地址就是具体的位置信息。
二、什么是变量用于存储某种类型的数据叫做变量比如int a定义了一个整型a变量那么这个时候计算机会给变量a自动分配了一个内存空间这个空间大小按int的占用的字节大小分配如整型占用4个字节内存也就是这么大这块内存空间的首地址就是指针通常可以用取址符取出地址即a这就是内部的空间分配逻辑。
三、什么是指针变量用于存储指针的变量也可以通俗的理解成存储地址的变量专门存储的地址的变量就是指针变量指针变量的定义是int *b b可以用来存储地址的变量 指针变量也是一个存储单元和普通变量一样区别是存储你单元里的内容是指针。 也可以理解成指向具体整型数字的指针。
注意:
对于指针变量 b是不能用*b对存储单元空间进行赋值比如*b10 这个时候会报错的如下
int a 10;
int *b;
*b20;
正确的写法有2种1指针指向一个有实际空间或已分配了空间的变量
int a 10;
int *b;
b a;
*b20;
2给指针b分配空间如下
int a 10;
int *b (int *)malloc(sizeof(int));
*b20;
以上必须要分清楚和理解到位否则很难去深刻运用指针
四、变量内存分配
上述代码中定义一个变量int a10是栈上分配函数结束即回收用malloc是动态分配空间变量的内存分配如下 1、栈区stack— 程序运行时由编译器自动分配存放函数的参数值局部变量的值等。其操作方式类似于数据结构中的栈。程序结束时由编译器自动释放。 2、堆区heap — 在内存开辟另一块存储区域。一般由程序员分配释放 若程序员不释放程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事分配方式倒是类似于链表呵呵。 3、全局区静态区static—编译器编译时即分配内存。全局变量和静态变量的存储是放在一块的初始化的全局变量和静态变量在一块区域 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放 4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放函数体的二进制代码。 五、C语言堆和栈空间如何交互
堆和栈是两个不同的内存区域用于存储程序中的数据。堆是由程序员动态分配的内存空间而栈则是由编译器自动管理的内存空间。
在C程序中堆和栈是两个独立的存储区域相互独立没有直接的交互关系。在函数调用时局部变量和函数参数都被存储在栈中当函数返回时这些变量和参数也会自动从栈中弹出并释放。而堆则是由程序员手动分配和释放内存。
可以使用指针在堆和栈之间传递数据。程序员可以通过将堆上分配的内存的地址存储在栈中来实现这一点。同时也可以将栈上分配的变量的地址存储在堆中。
例如可以使用malloc()函数在堆中分配内存并将其地址存储在指向堆中分配的内存的指针中。然后可以将指针传递给函数该函数可以在堆上分配空间并将结果存储在该指针所指的位置。最终可以使用free()函数释放在堆中分配的内存。
#include stdio.h
#include stdlib.hvoid swap(int* a, int* b) {int temp *a;*a *b;*b temp;
}int* heap_swap(int a, int b) {int* ptr (int*) malloc(sizeof(int) * 2); //分配堆空间*ptr b;*(ptr 1) a; //将栈上的数据复制到堆空间中return ptr; //返回堆指针
}int main() {int x 10;int y 20;printf(Before swapping: x%d, y%d\n, x, y);swap(x, y); //使用函数交换栈上的数据printf(After swapping using stack: x%d, y%d\n, x, y);int* ptr heap_swap(x, y); //使用堆空间交换数据x *(ptr 1);y *ptr;free(ptr); //释放堆空间printf(After swapping using heap: x%d, y%d\n, x, y);return 0;
}