#include <stdio.h> #include <stdlib.h> typedef struct node { int number; struct node *next; }Node; void Link_initialize(Node *plist); int main(void) { Node *plist = NULL; Link_initialize(plist); //初始化链表 printf("hello"); return 0; } void Link_initialize(Node *plist) { plist = (Node *)malloc(sizeof(Node)); plist->next = NULL; } 想用函数Link_initialize()初始化一个链表,但是在进行调试的时候,却出现了如图的情况,这很明显是显示初始化失败啊!这是为什么? |
|
10分 |
void Link_initialize(Node *plist)改
void Link_initialize(Node **plist) 用指针的指针 |
但是为什么改了之后第22行为什么会出现“错误:表达式必须包含指向结构或者联合的类型”? |
|
30分 |
#include <stdio.h> #include <stdlib.h> typedef struct node { int number; struct node *next; }Node; void Link_initialize(Node **plist); int main(void) { Node *plist = NULL; Link_initialize(&plist); //初始化链表 printf("hello"); free(plist); return 0; } void Link_initialize(Node **plist) { *plist = (Node *)malloc(sizeof(Node)); (*plist)->next = NULL; } |
上下文要一齐改哦,看赵老师的正确答案
Node *p 只表示一个节点的指针 Node **p 才是整条链 |
|
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告: VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。 不要企图依赖输出指针相关表达式…的值【比如printf(“%p\n”,…);或者cout<<…】来理解指针的本质, 这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑! 提醒: 不要迷信书、考题、老师、回帖; 有人说一套做一套,你相信他说的还是相信他做的? 不要写连自己也预测不了结果的代码! 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 十字链表交换任意两个节点C源代码(C指针应用终极挑战)http://download.csdn.net/detail/zhao4zhong1/5532495 |
|
仅供参考:
#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) { int **p,i; p=(int **)malloc(rows*sizeof(int *)); if (NULL==p) exit(1); for (i=0;i<rows;i++) { p[i]=(int *)malloc(cols*sizeof(int)); if (NULL==p[i]) exit(1); } return p; } void deletearr2d(int **p,int rows) { int i; for (i=0;i<rows;i++) { free(p[i]); } free(p); } int main() { int **arr2d,i,j,r,c; r=4; c=5; //在堆中开辟一个4×5的二维int数组 arr2d=newarr2d(r,c); for (i=0;i<r;i++) { for (j=0;j<c;j++) { arr2d[i][j]=i*c+j; } } for (i=0;i<r;i++) { for (j=0;j<c;j++) { printf(" %2d",arr2d[i][j]); } printf("\n"); } deletearr2d(arr2d,r); r=6; c=3; //在堆中开辟一个6×3的二维int数组 arr2d=newarr2d(r,c); for (i=0;i<r;i++) { for (j=0;j<c;j++) { arr2d[i][j]=i*c+j; } } for (i=0;i<r;i++) { for (j=0;j<c;j++) { printf(" %2d",arr2d[i][j]); } printf("\n"); } deletearr2d(arr2d,r); return 0; } // 0 1 2 3 4 // 5 6 7 8 9 // 10 11 12 13 14 // 15 16 17 18 19 // 0 1 2 // 3 4 5 // 6 7 8 // 9 10 11 // 12 13 14 // 15 16 17 // |
|
《牛肉干》
C语言上机课,某女同学偷偷吃起牛肉干。 有一粒牛肉干掉到了键盘上,卡在7和8键之间。 女同学就在键盘上抠啊、抠…… 程序里一行代码变成这个样子: int *pa=&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&a; 后来的结局是 ————顺利通过编译,结果正确! |