内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

首页 > 小知识 > 正文

请教两个结构体指针的问题

2019-03-16 出处:网络 整理:zhishizhan.net

    话题:请教两个结构体指针的问题

    推荐回答:之前定义了一个指针 ,应该是 test* 类型在这个地方进行 强制转换为(test*) 赋值给 p第三行 是将你的结构体指针 地址 转换成 void *

    参考回答:这是因为你把一个结构体的对象赋给了一个指针类型的。当然会报错了,所以你应该改一下,for(int i = 0;itemp++=exa++;

    话题:请教两个C++非常基础的指针问题~

    推荐回答:问题一: p 和 q都指向实际内存空间node。问题二:函数一 中的delete oldTop之后,是指原来top所指向的内存空间被释放,这个时候oldTop变量任然存在,其值也不变,任然指向原来的内存空间,只是该内存空间已经被释放,没有任何意义。oldTop-gt;next 这已经没有意义了,而不是oldTop-gt;next = NULL 。其实你可以试一下,delete操作后,oldTop-gt;next 不是NULL ,而是系统在清理内存时自动分配的值,是没有意义的。一般情况下,在对指针变量做delete之后,要将该指针变量清,比如delete oldTop; delete后,oldTop 所指向的内存单元已经毫无意义,相当于野指针了,所以接下来一般要进行清。oldTop = NULL; 清----------------------------------------------------函数二 中的oldTop-gt;next=null; 是多余的因为你马上delete oldTop了,在delete oldTop的时候,oldTop-gt;next 自动释放。因此最好是这样:oldTop = top;top = oldTop-gt;next;delete oldTop;oldTop = NULL;

    参考回答:问题一:node*q=p; 请问这时执行这步操作之后,p和q是都指向实际内存空间node,还是只有q指向node了呢?? 这一步以后,p和q是都指向实际内存空间node ;函数一.oldTop=top ; top是原始的头指针,oldTop是保存当前节点用的临时的指针top=oldTop-gt;next ; ③delete oldTop; 就是这一步跟问题一有关系,我想这时oldTop-gt;next应该是NULL了 才对吧,请赐教?!!!delete oldTop; 是对的,因为你当前的指针top已经指向了下一个指针,而原来的指针oldTop就没有用了,就要delete;函数二.oldTop=top;top=top-gt;next; ③oldTop-gt;next=null; ④delete oldTop; 函数一的③取代了函数二的③④,请高手不吝赐教~ 小弟不胜感激.!!!!!!!!!!!这个方法也行,oldTop-gt;next=null; ④这一句严格来说是没有问题的,但是就是你不写这一句oldTop 被delete后,这个节点oldTop就不存在了,所以说oldTop-gt;next也不存在了。

    话题:C语言高手进关于双重指针

    推荐回答:1、多重指针常用于多维数组或者多维字符串的操作,有时也用于函数参数传递;2、指针是C语言的一个重要知识点,你可以简单理解为地址。多重指针需要通过多次寻址才能找到实际的值。这里一个示例:# includeint main(){unsigned int x=0x1234;unsigned int *p1=NULL;unsigned int **p2=NULL;unsigned int ***p3=NULL;p1=amp;x;p2=amp;p1;p3=amp;p2;printf("\n x=0X%X, amp;x=:0X%X",x,amp;x);printf("\n *p1=0X%X, p1=:0X%X, amp;p1=:0X%X",*p1,p1,amp;p1);printf("\n **p2=0X%X, *p2=:0X%X, p2=:0X%X, amp;p2=0X%X",**p2,*p2,p2,amp;p2);printf("\n***p3=0X%X, **p3=:0X%X, *p3=:0X%X, p3=:0X%X, amp;p3=:0X%X",***p3,**p3,*p3,p3,amp;p3);return 0 ;}显示结果:x=0X1234, amp;x=:0X6C56C2*p1=0X1234, p1=:0X6C56C2, amp;p1=:0X6C56C20**p2=0X1234, *p2=:0X6C56C2, p2=:0X6C56C20, amp;p2=0X6C56C2***p3=0X1234, **p3=:0X6C56C2, *p3=:0X6C56C20, p3=:0X6C56C2, amp;p3=:0X6C56C20所有类型变量都可以通过amp;获得该变量在内存中的地址,从以上示例看出变量x在内存中的地址为:0X6C56C2指针变量p1的地址为:0X6C56C20指针变量p2的地址为:0X6C56C2指针变量p3的地址为:0X6C56C20以上变量按照定义先后顺序在内存中从高地址到低地址连续存储的,每个变量占据个字节空间。其中p3的值(也就是0X6C56C20这个地址的内存中存放的数据)为p2的地址。p2的值(也就是0X6C56C2这个地址的内存中存放的数据)为p1的地址。p1的值(也就是0X6C56C20这个地址的内存中存放的数据)为x的地址。要取得最终的0x1234这个数据,几重指针前面就有几个*,比如***p3就表示0x1234这个具体的值。只要少一个*,那么获得的就是地址。

    参考回答:p被定义为含有4个整数的数组指针,其初始值被指向了2维数组a的首成员a[0][0]的地址。*p+1是指针移动,指向a数组的下一个成员即a[0][1]的地址则*(*p+1)=2;p+1则是数组指针移动,移动到p本身以外,p本身是4个整数*(p+1)则指向a的第5个成员及a[1][0]的地址,所以**(p+1)的值是5.5-2=3结果是3. 下面是测试程序,你可以编译运行看看就知道结果了:#include lt;stdio.hgt;int main(){ int a[][4] = {1,2,3,4,5,6,,};int (*p)[4] = a;int b =**(p+1) - *(*p+1);printf("%d-%d=%d", **(p+1), *(*p+1), b);}

    话题:还是关于二级指针的问题

    推荐回答:如果你纠结几级指针,你就输了。整个3级、4级指针,指定蒙圈完蛋。分析多星指针主要两个小技巧:1、关注指针的含义、作用;2、将type* 看作一个新的类型。=================================================分析一下你的例子:int**q=calloc(10,sizeof(int*));从意义角度来讲,这是一个申请指针数据的语句。于是,在sizeof里面填写的是int*,表明这个指针数组是一个int型的指针数组。那么在q中存储的便是指针数组的首地址。申请成功后,访问这个数组有两种方式,即提到的*(q+1)以及q[1]。为什么不是*q+1呢?我们假设q的值是addr_0,那么从第一个元素开始的各元素地址是addr_0、addr_1、、addr_。而各元素的内容分别为content_0、content_1、、content_。其中addr_*是连续地址,content_*是用户填的不连续内容。*q表示,将q中存储的数据addr_0,作为地址,返回内容。明显地址addr_0的值是content_1嘛,于是*q的结果是content_0。接着*q+1,那么此时的执行结果是content_0+1。这是什么意思呢?就是将指针数组的第2个元素的值,看作另外一个数组的首地址,取这个数组的第2个元素。同理*(q+1),q的值是addr_0,那么,q+1为,addr_0+1,又知道addr_0与addr_1地址连续,那么addr_0+1便是addr_1。此时对addr_1取内容的话,便是content_1。=================================================Tips:从上面的分析中,你也可以看出,始终没有讨论过几级指针的事情,而是讨论指针的含义。指针分级讨论的坏处是僵化,造成不理解。而理解代码,最重要的是理解代码的含义,而不是代码的形式。C语言指针相当灵活,也就是说,使用限制几乎没有。在不严格的程序员那里,他可能会用的很爽,但是代码的阅读性会非常低。要理解某段代码中的指针用法,始终不能脱离这个指针的功能背景。另外呢,写代码的时候可以有些小习惯,实践将指针看作一个新类型,而不是从属于某个主类型的指针。比如:int* *q = calloc( 10, sizeof( int* ) );代码中加了点空格。我们将int*看作是一个类型。那么*q表征数组。这与非指针的申请多类似啊。double *q = calloc( 10, sizeof( double ) );此时,double的数组怎么用,int*的数组就该怎么用。

    参考回答:那么也可以知道*q+1=amp;a[1]。谁告诉你的这么是对的?你想这么写也应该是*(q+1)=amp;a[1]。但是你以为这么就对了?*q里是个指针指针的下一4字节大小是什么谁也不知道

    话题:关于指针的问题?

    推荐回答:这个是对指针原理的理解,先给你讲下指针的原理吧指针就好比是一个箭头,这个箭头指向的是变量在内存中的地址,而指针运算符*表示取出这个地址中的值,而语句int *p;这里的p是变量的名字,首先他和*指针运算符结合,表示这个变量是一个指针,也就是说变量名p是一个指针变量,注意p才是指针变量,而*p就不是指针变量了,*p表示的是指针p所指向的内存的地址的值,一般情况下*p能代表p所指向的地址所表示的变量,比如int *p, a=1; p=a; 这时对*p操作就相当于是对变量a进行操作,比如*p=3,这时变量a的值也会被修改为3,这很容易理解,*p=3表示把指针p所指向的地址的值修改为3,而这个地址是变量a的地址,因此变量a的值也被修改了。因此在进行赋值时,需要对指针变量p赋给一个变量的地址(因为指针指向的是变量在内存中的地址),而不能把一个变量的值赋给他,而*p表示的是地址中的值,因此对*p赋值应把一个变量的值赋给他,所以以下 语句中p=q; 正确,表示把指针变量q指向的地址赋给指针变量p,这时指针p指向了与q相同的内存地址。p=*q; 错误,*q表示的是指针q所指向的内存地址中的值,不能将值赋给指针变量。*p=q; 错误,指针q指向的是内存的地址,而*p表示的是地址中的值,不能将地址赋给一个变量。*p=*q; 正确

    参考回答:p=q; 地址赋值,q的地址值赋给pp=*q; 错误,int类型不能向int*转换*p=q; 错误*p=*q; q中的内容赋值给p地址保存的内容也许,在一些应用中让你混淆。int a[10],*q,*p[5];q = a; a数组首地址*p = a; *p相当于p[0], p是一个指针数组,数组元素是指针int*类型*q = a; 这就报错p = a; 这个也会报错。有问题可以追问

    话题:C语言两个指针相减的问题

    推荐回答:虽然地址是随机的,因为数组从首地址开始依次相连#includeint main(){char a[10]; char *b=amp;a[2];char *p=amp;a[];printf("a[0]=%d\n",amp;a[0]); 若a[0]地址为1000printf("a[10]=%d\n",amp;a[10]); a[10]的地址就为1000+10printf("a[2]=%d\n",amp;a[2]); 所以a[2]为1000+2printf("a[]=%d\n",amp;a[]); a[]为1000+printf("%d",b-p); a[2]-a[]就等于1002-100=-6return 0;}看看这段代码,希望能帮助你,望采纳

    参考回答:c语言中的地址相减,其实并不是,我们想象中的直接相减的结果就是答案。其实,结果还和减数与被减数有关的,具体求解办法如下公式:((void*)paddr1 - (void*)paddr2)/sizeof(type),type即是 所指的类型。所以,如果两个整数地址相减 ,则需要在相减的结果基础上再除以4,所以就是2了,同理可以得出两个char类型地址相减 结果是。

    话题:一个用指针交换两个字母数值的问题

    推荐回答:这个问题其实很简单,我给你解释一下:首先你的函数没有返回值,是void类型的,其次,你在void swap3()中交换的是形参——也就是说你在main()里面把c、d的地址传过去了,void swap3()中用指针a指向c的地址、b指向d地址,然后交换了这两个指针,也就相当于变成了a指向d的地址、b指向c地址,但是!!!但是c、d当中存的数值并没有发生变化,你在main()中输出c、d的值,仍然会输出它们各自的值。这个void swap3()函数并没有起到交换值的作用,它仅仅交换了形参指针,而这对c、d没有影响,因为形参在void swap3()函数结束时时被销毁的,而你也没有返回任何值(当然这里返回了也没有用)。不知道我这么解释你明白不?下面是我写的函数:void swap3(int *a, int *b){ int temp = *a; 取形参指针a指向的存储,将存储的值赋给temp*a = *b; 同样的,把形参指针b指向的存储的值赋给a*b = temp; 最后将b指向的内存块写为temp的值};这样虽然你的函数没有返回任何值,但是你却把主函数中c、d的值交换了希望你能够将形参、实参弄清楚,以及它们的作用域。祝你进步

    参考回答:因为你的做法实际上还是值传递,参数中传过去的是两个数的地址值的副本,所以最后还是不能实现交换程序修改如下:#include "stdafx.h"#include "stdio.h"void swap3(int *a, int *b){ int temp = *a; 注意这里,改成了对存储的内容的处理,实际上是引用传递*a = *b; *b = temp; };int main(int argc, char* ar[]){int c = 10, d = 20;swap3(c, d);printf(" c = %d, d = %d", c, d);return 0;}

    话题:2个关于指针的问题,现在我先发一个,请各位大师教一教我这个初

    推荐回答:程序中if(*(*p2+1)%2==0)应当写作if(*(*p2+i)%2==0)吧第二个在定义month数组时相当于要定义char month[][]两维数组,这在c中要求给定

    参考回答:你好,把if(*(*p2+1)%2==0)中1改成i就行了,我运行了一下是好的,你试试。。。最后祝你学习顺利,求采纳。

    话题:C语言关于二级指针的问题,我不太懂二级指针,有个题目是:用指针

    推荐回答:第一条改成int a[10][20],*p=a[0];二维数组本来就是以为数组,二级指针是指针的指针,不同概念char *a[]=;char **p=a;这里定义了一个指针数组,里面保存了两个地址,一个是字符串a的首地址,一个是字符串b的首地址,然后数组的首地址a,这样用一个二级指针才能访问,这就是所谓的指针的指针int a[2][2]=;int (*p)[2]=a;(*p)[2]的意思是,p是一个指针变量,只想一个有两个元素的一位数组,这不刚刚就是二维数组的首地址吗?所以这个(*p)[2]是可以指向二维数组首地址*p[2]的意思是,定义一个数组,里面有两个指针元素,这和"[]","*"运算符优先级有关的

    参考回答:看样子老兄是新手,对指针理解不深啊。 首先,你哪里有用到指针数组啊?那时数组指针。 其次,楼上说得对,你的t没有初始化,虽然有时候编译器会为你做这些工作,但这绝不是好习惯。 最后,问题应该出在这里: 在后一个程序中,用了x[100],这样先为存放字符分配了100字节的空间,再把首地址的值给了x,这样没有问题; 在前一个程序里呢?仅仅用了*x,这时仅仅是给了x两个字节的空间,让它可以用来存放一个地址,你在这时连x指向哪里都不知道,更没有分配存放字符的空间,就向里边倒东西,不出错才怪呢。

    话题:两个指针数组交换的问题

    推荐回答:你中间那个交换数组元素的循环一共循环了16次,相当于把数组倒置了两次,第一次交换数组变成降序,第二次交换数组又变回了升序!

    参考回答:交换太多了。for(i = 0; i lt; 4; ++i) {temp = *ptr1;*ptr1 = *ptr2;*ptr2 = temp;++ptr1;--ptrs;}以上足矣完成交换过程。

相关文章

搞笑图片