1、汉克char a = hello world1和char *p = hello world2;的区别分类:C/C+2011-10-15 17:261053人阅读评论(1)收藏举报平台c1. 1#include2. 3. 24. 5. 3intmain()6. 7. 48. 9. 5chara=helloworld1;10. 11. 6char*p=helloworld2;12. 13. 7*(a+1)=q;14. 15. 8*(p+1)=q;16. 17. 9printf(%sn,a);18. 19. 10printf(%sn,p);20. 21. 1122. 23. 12运行结果段错误。注释
2、*(p+1)=q;运行结果hqlloworld1helloworld2原因:一、a与p类型不同:p为指向字符串的指针;a为保存字符串的数组。5 char a = hello world1;是个赋初值的字符数组。6 char *p = hello world2;是个字符串常量指针;指针变量p在栈里面字符串常量hello world2在全局数据区,数据段,只读,不可写二、hello world2和hello world1字符串保存的位置不同。hello world1保存在栈中,可用*(a+1)=q修改,hello world2保存在全局数据区,位置是在.rodata中,不能修改*(p+1)=q三、
3、只有2中情况下,数组名不可等同视为数组指针,&与sizeof操作符“&”的区别:&p取得是指针变量的地址,而非字符串helloworld2的首地址,p指向字符串的首地址;&a取得就是字符串hello的首地址。“siziof”的区别:下面假设在ia32平台上运行,保存变量的内存空间不同。sizeof(p);/return4,pointersizesizeof(a);/return13,arraysize1. 5chara=helloworld1;2. (gdb)pa3. $1=000006005?/空4. (gdb)s5. 6char*p=helloworld2;6. (gdb)pa7. $2=
4、helloworld18. (gdb)p&a9. $3=(char(*)13)0xbfde0583/在栈10. (gdb)s11. 7*(a+1)=q;12. (gdb)pp13. $4=0x80484c0helloworld2/在数据段14. (gdb)p&p15. $5=(char*)0xbfde0590/在栈在函数里char p = hello world 与 char *p = Hello world 造成的效果不一样,为什么?请高人告知!2006-11-09 19:02lee072|分类:其他编程语言|浏览2252次请看两个程序:(1)char *GetString(void) ch
5、ar p = Hello world; return p;void main() char *str = NULL; str = GetString(); cout str endl;(2)char *GetString(void) char *p = Hello world; return p;void main() char *str = NULL; str = GetString(); cout str endl;为什么(1)输出的是乱码,(2)能够输出 hello world我觉得可能是指针字符串和数组字符串分配空间时的区别,有谁知道具体的吗?谢谢!分享到:2006-11-09 19:
6、22提问者采纳这个我知道. 因为我也为这个问题困扰过, 做过一些探讨.Hello world作为静态字符串实际上存储在数据区,但写程序的人不知道这个地址,而程序本身知道。当某一函数以 char p = Hello world; .方式使用此静态字符串时,实际上相当于: char p12; strcpy(p, Hello world); .p12是在栈里临时分配的。虽然p指向的内容是Hello world, 但是这是复制品,不是原件。当函数结束,char p就被程序回收了,所以p的内容就不再是Hello world了。但如果以char *p=Hello world的方式使用,p指向的是静态字符串
7、存储的位置,也就是说指向Hello world的原件,当然没有问题了。如果想坚持用char p而不使用char *p, 有效方法必须是:static char p=Hello world;return p;原因我想很清楚了。static char 是静态的,存储在数据区。提问者评价多谢大虾的指点!建立单向动态链表,并对它进行插入、删除和输入等操作,包括以下任务:liapi123|Lv3|被浏览14次|来自360安全卫士2013-06-14 6:521、写一个函数creat,用来建立一个动态链表,各结点的数据由键盘输入。2、写一个函数print,将上题建立的链表中各结点的数据一次输出。3、写一个
8、函数del,用来删除动态链表中一个指定的结点(由实参指定某一学号,表示要删除该项学生的结点)。4、写一个函数insert,用来向动态链表插入一个结点。5、将以上4个函数组成一个程序,有主程序先后调用这些函数,实现链表的建立、输出、删除和插入,在主程序中指定需要删除和插入的结点。请分别:1、用一个文件包含这些函数。2、把每个函数作为一个文件,然后把它们放在一个项目文件中处理满意回答#include #define LEN sizeof(struct number) struct number /*定义编号和数字*/ int name; int num; struct number * next;
9、 ; struct number * create() /*建立链表函数*/ struct number * head,* new,* tail,* p; int count=0; while(1) new=(struct number *)malloc(LEN); printf(input Name and Numbern); scanf(%d %d,&new-name,new-num); /*用户输入编号和数字*/ if(new-name=0) free(new); break; else if(count=0) head=new; tail=new; else tail-next=new
10、; tail=new; count+; tail-next=NULL; return(head); struct number * delist(struct number *head,int name) /*删除数字的函数*/ struct number * p0,* p1; p1=head; if(head=NULL) printf(nempty list!n); else if(p1-name=name) /*找到相同编号*/ head=p1-next; else while(p1-name!=name&p1-next!=NULL) /*逐一排查*/ p0=p1; p1=p1-next;
11、 if(p1-name=name) p0-next=p1-next; printf(The node is deletedn); else printf(The node can not been foud!n); return head; struct number * insert(struct number * head,struct number * new) /*插入函数*/ struct number * p0,* p1; p1= head; if(head=NULL) head=new; new-next=NULL; else if(new-namename) /*寻找新数字适合
12、的位置插入*/ new-next=head; head=new; else while(new-namep1-name) p0=p1; p1=p1-next; new-next=p0-next; p0-next=new; return(head); void print(struct number * head) /*打印函数*/ struct number * p; p=head; if(head=NULL) /*其实用不到*/ printf(list is emptyn); else while(p!=NULL) printf(%d%dn,p-name,p-num); /*打印链表内容*/
13、 p=p-next; struct number * find(struct number * head,struct number * new) /*查询函数*/ struct number * p0,* p1; p1= head; if(head=NULL) head=new; new-next=NULL; else if(new-name!=p1-name) /*寻找和输入编号相同的节点,不是则往下读*/ new-next=head; head=new; else while(new-name=p1-name) printf(”find successfully!n”); printf(
14、“%d %d”,p1-name,p1-num); return(head); void main() /*主函数*/ struct number * head,* p; int name; head=create(); /*往下逐一调用函数*/ print(head); printf(Input the delete number:); scanf(%d,&name); head=delist(head,name); print(head); printf(Input the inserted name and number:); p=(struct number *)malloc(LEN);
15、 scanf(&d&d,p-name,p-num); head=insert(head,p); print(head); printf(“Input the found name:”); scanf(“%d”,&name); head=find(head,p); print(head); find函数你可以不用,在主函数中将find函数也一起删掉就行了。函数实现将一个单向链表的结点倒置排列2011-05-06 15:58当时就毛了我|分类:数据结构及算法|浏览723次struct node* fun(struct node*head) Struct node *p,*q; If(head=NU
16、LL|_)return head; P=head;q=p-next; While(_) _; q-next=head; head=q;_; return head; 那几个空填啥,还有每一句的意思。分享到:2011-05-06 16:58提问者采纳以循环的第一趟为例进行讲解:structnode*fun(structnode*head)Structnode*p,*q;If(head=NULL|head-next=NULL)/只有链表为空或只有一个结点returnhead;P=head;/p从第1个结点起q=p-next;/q从第2个结点起,并且q几乎总在p的下一个结点位置while(q!=NU
17、LL)p-next=q-next;/第1个结点直接指向第3个结点q-next=head;/q作为新的首结点head=q;/head重新定位q=p-next;/p总是出现在p的下一个位置returnhead;补充程序:(1)head-next=NULL(2)q!=NULL(3)p-next=q-next(4)q=p-next示意图:用C+实现一链表,其中每个节点都是一个类。能实现插入、删除、查找等功能5满意答案PK放假4级2010-12-27class LinkNode/以一个int 举例public:LinkNode(int i ) node = new LinkNode(i);/嗯 这是精髓
18、所在int i;LinkNode *node;/起到牵尾巴的作用;template class Linklistprivate:/Vector l; 用Vector Container 方法就简单很多 因为里面有add.等等方法LinkNode *head;/纪录头;public:bool add(LinkNode *l);/关键就是LinkNode()构造函数有尾巴 ,因此可以不停地加结点bool del(LinkNode &l);/用删除的条件创建Node l ,遍历查找如符合条件则删除 并返回true;LinkNode *search(LinkNode *l,LinkNode &inde
19、x);/输入搜索条件index,如找到改结点的指针/another methods;补充:刚才的有误class LinkNode/以一个int 举例public:LinkNode(int i ) this.i = iint i;LinkNode *node;/起到牵尾巴的作用;template class Linklistprivate:/Vector l; 用Vector Container 方法就简单很多 因为里面有add.等等方法LinkNode *head;/纪录头;LinkNode *fence;public:bool add(LinkNode *l);/调用LinkNode构造函数
20、fence-node= new LinkNode(i);这没错了bool del(LinkNode &l);/用删除的条件创建Node l ,遍历查找如符合条件则删除 并返回true;LinkNode *search(T&index);/输入搜索条件index,如找到改结点的指针否则返回空/another methods;编写一个完整的程序,实现单链表的建立、插入、删除、输出等基本操作。zhanshi122|Lv3|被浏览18次|来自360安全卫士2013-06-26 7:201)建立一个带头结点的单链表。 (2)计算单链表的长度,然后输出单链表。 (3)查找值为x的直接前驱结点q。 (4)删
21、除值为x的结点。 (5)把单向链表中元素逆置(不允许申请新的结点空间)。 (6)利用(1)建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。 (7)在主函数中设计一个简单的菜单,分别测试上述算法满意回答typedef int Elemtype; typedef int status; #define OVERFLOW -2 #define OK 1 #define ERROR -1 #include stdio.h #include stdlib.h typedef struct LNode Elemtype data; struct LNod
22、e *next; *linklist; /构造链表 void Create_Linklist(linklist &L) linklist p; p=(linklist)malloc(sizeof(LNode); if(!p) exit(OVERFLOW); L=p; L-next =NULL; /节点插入 void Insert_Linklist(linklist &L) linklist p; int n,i; printf(请输入插入节点的个数n: ); scanf(%d,&n); getchar(); for(i=n;i0;i-) p=(linklist )malloc(sizeof(L
23、Node); scanf(%d,&p-data); p-next=L-next ; L-next =p; /遍历输出并输出长度 status Visit_linklist(linklist &L) linklist p; int i=1; p=L-next ; if(L-next=NULL) return ERROR; while(p-next !=NULL) printf(%d ,p-data ); p=p-next ; i+; printf(%dn,p-data ); printf(长度为:%dn,i); return OK; /查找值为x的直接前驱结点q并输出 void Search_l
24、inklist(linklist &L) int x,k=0; linklist p=L,q; printf(输入x: ); scanf(%d,&x); getchar(); if(L-next =NULL) printf(该表为空 !n); while(p-next!=NULL) q=p; if(p-next -data =x) printf(%d ,q-data ); k=1; p=p-next ; if(p-next &p-data =x) printf(%d ,p-data ); k=1; if(k=0) printf(未找到值为%d的结点n,&x); printf(n); /删除节点
25、 status Delete_linklist(linklist &L) linklist p,q; int k=0,x; printf(请输入删除节点的值x: ); scanf(%d,&x); getchar(); if(L-next =NULL) return ERROR; p=L; q=L-next ; while(q!=NULL) if(q-data =x) k=1; p=q ; p-next =q-next ; free(q); q=p-next ; else p=q ; q=p-next ; if(k=0) printf(表中没有值为%d的结点!n,&x); return OK; /链表逆置 void Li
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1