C++中 指针怎么修改数值的? 下面的例子具体不是很明白,改变了指针指向,怎么会改变了数值了呢?

C++中 指针怎么修改数值的? 下面的例子具体不是很明白,改变了指针指向,怎么会改变了数值了呢?,第1张

ptr指的是这个指针所指向的内存空间。就是指针指向的INT变量。

看看swap函数,理解了就好。

int temp;

temp=pt1;//把ptr1指向的int变量的值赋值给TMEP

pt1=pt2;//把ptr2指向的int变量的值赋值给×ptr1的内存空间。就是现在ptr1指向的那段内存空间的int变量的值变成了原来ptr2指向的那个变量的值

pt2=temp;//赋值回来,完成交换

改变。根据查询相关公开信息显示,当指针传入函数指针时,如果函数指针所指向的内容被函数修改,则传入指针的内容也会被修改。函数指针是指向一个函数或变量地址的指针,指针所指向的内容可以被函数直接修改。

因为s_head是一个指针类型的形参,在函数中不能够改变指针所指向的地址,只能够改变指针所指向的地址的值,可以把函数的形参表列改为int creat(struct soldier s_head,int c,int m) ,这样就可以改变s_head指针所指向的值了,在函数中有些地方可能也要修改一下,如:s_head=s_p=s_q=0;改为s_head=s_p=s_q=0; 等等 自己尝试一下就行了。。。

Linux内核空间中常见的内存分配函数

void kmalloc(size_t size,gfp_t flags) kmalloc() 申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因为存在较简单的转换关系,所以对申请的内存大小有限制,不能超过128KB。

较常用的flags()有:

flags 的参考用法:

|– 进程上下文,可以睡眠     GFP_KERNEL

|– 进程上下文,不可以睡眠    GFP_ATOMIC

|  |– 中断处理程序       GFP_ATOMIC

|  |– 软中断          GFP_ATOMIC

|  |– Tasklet         GFP_ATOMIC

|– 用于DMA的内存,可以睡眠   GFP_DMA | GFP_KERNEL

|– 用于DMA的内存,不可以睡眠  GFP_DMA |GFP_ATOMIC

释放内存

void kfree(const void objp)

kzalloc() 函数与 kmalloc() 非常相似,参数及返回值是一样的,可以说是前者是后者的一个变种,因为 kzalloc() 实际上只是额外附加了 __GFP_ZERO 标志。所以它除了申请内核内存外,还会对申请到的内存内容清零。 kzalloc() 对应的内存释放函数也是 kfree()。

static inline void kzalloc(size_t size,gfp_t flags) {return kmalloc(size,flags |_GFP_ZERO);}

void vmalloc(unsigned long size); vmalloc() 函数则会在虚拟内存空间给出一块连续的内存区,但这片连续的虚拟内存在物理内存中并不一定连续。由于 vmalloc() 没有保证申请到的是连续的物理内存,因此对申请的内存大小没有限制,如果需要申请较大的内存空间就需要用此函数了。

释放内存

void vfree(const void addr);

注意vmalloc和vfree时可以睡眠的,因此不能从中断上下问调用

kmalloc()、kzalloc()、vmalloc() 的区别是:

一般地,在使用虚拟内存技术的多任务系统上,内核和应用有不同的地址空间,因此,在内核和应用之间以及在应用与应用之间进行数据交换需要专门的机制来实现,众所周知,进程间通信(IPC)机制就是为实现应用与应用之间的数据交换而专门实现的。

通常情况下,应用程序通过内核接口访问驱动程序,因此,驱动程序需要和应用程序交换数据。Linux将存储器分为“内核空间”和“用户空间”。 *** 作系统和驱动程序在内核空间运行,应用程序在用户空间运行,两者不能简单地使用指针传递数据。因为Linux系统使用了虚拟内存机制,用户空间的内存可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。Linux内核提供了多个函数和宏用于内核空间和用户空间传递数据。

不行, 原因是found函数已经声明成返回一个int指针的函数了,如果不声明p为指针则在p=founc(a,n)时会因为类型不匹配而报错。两种方法可以解决:1,直接省略掉变量p,在printf语句中直接用printf("%d", found(a,n));来输出结果;2,修改found函数为:<pre t="code" l="cpp">int found(int b[10], int n)

{

return b[n-1];

}则p可以直接声明为int, 且赋值时用p=found(a,n); 输出时用printf("%d", p);可以看到这样改动的比较多。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12163182.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存