C语言中的形参是指针的传参技巧

之前我好像有听过直接省去a = 2,b = 3这两个赋值过程,直接可以通过转化为无名数组元素将2,3传入,但具体转换操作有点不清楚,求大神现身。图片说明

1个回答

swap(2,3)这个

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c语言,形参是指针的引用,和形参是指针,两者结果不同,求指点
自定义的头文件 ``` typedef struct BiTNode { int data; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree; ``` 如下是使用形参是指针的引用的函数,结果是正确的 ``` #include "BiTree.h" #include "stdlib.h" #include "stdio.h" bool Delete(BiTree &p) { BiTree q = (BiTree)malloc(sizeof(BiTNode)); q = p; p = p->lchild; free(q); return true; } bool DeleteBST(BiTree &T, int key) { if (!T)return false; else if (key==T->data) { return Delete(T); } else if (key < T->data) { return DeleteBST(T->lchild, key); } } int main() { BiTree t1 = (BiTree)malloc(sizeof(BiTNode)); BiTree t2 = (BiTree)malloc(sizeof(BiTNode)); BiTree t3 = (BiTree)malloc(sizeof(BiTNode)); t1->data = 3; t2->data = 2; t3->data = 1; t1->lchild = t2; t1->rchild = NULL; t2->lchild = t3; t2->rchild = NULL; DeleteBST(t1, 2); printf("%d\n", t1->lchild->data); system("PAUSE"); return 0; } ``` 结果 ![图片说明](https://img-ask.csdn.net/upload/201605/26/1464229127_799521.png) 然后如下是形参为指针的,其实函数是一样的,只是形参从上面的接收指针的引用改为了接收指针 ``` #include "BiTree.h" #include "stdlib.h" #include "stdio.h" bool Delete(BiTree p) { BiTree q = (BiTree)malloc(sizeof(BiTNode)); q = p; p = p->lchild; free(q); return true; } bool DeleteBST(BiTree T, int key) { if (!T)return false; else if (key==T->data) { return Delete(T); } else if (key < T->data) { return DeleteBST(T->lchild, key); } } int main() { BiTree t1 = (BiTree)malloc(sizeof(BiTNode)); BiTree t2 = (BiTree)malloc(sizeof(BiTNode)); BiTree t3 = (BiTree)malloc(sizeof(BiTNode)); t1->data = 3; t2->data = 2; t3->data = 1; t1->lchild = t2; t1->rchild = NULL; t2->lchild = t3; t2->rchild = NULL; DeleteBST(t1, 2); printf("%d\n", t1->lchild->data); system("PAUSE"); return 0; } ``` 结果 ![图片说明](https://img-ask.csdn.net/upload/201605/26/1464229251_539966.png) 结果明显是有问题的,原因应该在free了第2个结点,却没把第一个结点的lchild改为指向第3个结点。可是为什么前一个(即接收指针的引用那个)却没问题呢?两个的区别仅仅在于接收的参数,可是前一个没问题而后一个出了问题。我想不明白前一个为什么会没出问题,求大神指点
c语言中函数形参为空指针,调用时可以不用带实参吗?
最近在看代码,有地方不太懂 void map_hash_init(void) { map_hash_head = hash_create ((uint32_t (*)(void *))(con_key), (int (*)(void *, void *))(Con_comp)); } 这是一个hash表的初始化 hash_creat的原型: hash_create (uint32_t (*hash_key) (), int32_t (*hash_cmp) ()) { return hash_create_size (HASHTABSIZE, hash_key, hash_cmp); } con_key函数: uint32_t con_key(void *data) { uint32_t key; T_ConnectionId *pData = (T_ConnectionId *)data; key = ((pData->srcNeId + pData->tunnelId) * HASHNUM + (pData->desNeId + pData->lspId)) % HASHTABSIZE; return key; } 为什么在hash初始化的时候,直接(uint32_t (*)(void *))(con_key)就可以?con_key不是要带实参的吗?
C语言关于指针的一个编程
Exercise 6-1 已给程序: • statistics.h • my_pointerFun.h 需要完成并提交的程序: • statistics.c • my_pointerFun.c • my_pointerFun.h • main.c • 1. 完成函数my_pointerFun(顾名思义,指针函数),该函数需有两个整型参数(x and y )且没有返回值. 要求完成的功能在my_pointerFun.h有详细描述。注意在文件头需进行正确的函数声明。 2.按照statistics.h 中的要求完成statistics.c文件 3. 写出测试程序main.c以测试你的程序是否正确。 注意: • my_pointerFun部分占成绩的20%,main 部分占%10, statistics 部分占70%。 • 这里考察的是将指针作为函数参数问题。 • my_pointerFun.h #ifndef _POINTERFUN_H #define _POINTERFUN_H /** Set values by pointers * If param x and y point to the same variable, output value 1 + 2 to it, otherwise: * param x pass-by-pointer: output value 1 * param y pass-by-pointer: output value 2 **/ //注意此处的output并不是输出到屏幕上, 而是对函数而言,函数通过形参可以进行输入, 也可以通过形参返回值(输出) void my_pointerFun( double* x, double* y); #endif • statistics.h #ifndef C_STATISTICS_H #define C_STATISTICS_H #include <stddef.h> /** Read doubles from stdin and calculate statistics of them. * Reading terminates after enough values have been read or when reading a value fails. * If no values are read, nothing is returned via min/max. * param count pass-by-pointer: input max amount of values to read, output actual count of values read, cannot be NULL * param min pass-by-pointer: input none, output min value, nothing if NULL * param max pass-by-pointer: input none, output max value, nothing if NULL * param sum pass-by-pointer: input old sum, output updated sum, nothing if NULL * return the last value read successfully (0.0 if no values were read) **/ double statistics(size_t* count, double* min, double* max, double* sum); #endif
C语言函数的形参(结构体类型)和实参类型(指针)可以不同吗?
int numstus; int lens; student *pointer; void main() { int i=1; char str[2]; lens=100; pointer=(student *)malloc(lens*LEN); /*分配内存*/ numstus=0; welcome(); /*欢迎界面*/ while(i>0) { i=menu_select(); /*控制菜单*/ switch(i) { case 1:addrecord(pointer);break; /*增加学生信息*/ 。。。省略 而当调用addrecord函数的定义是 void addrecord(student stud[]) {...} pointer是个结构体指针 addrecord参数是 结构体类型 程序无错,传递可行 真是怎么回事
如何在C语言中以数组指针作为形参输出数组
#include "stdafx.h" void cmdsend(unsigned int * info); int main() { unsigned int senddata[5]; senddata[0] = 8; senddata[1] = 2; senddata[2] = 0; senddata[3] = 4; senddata[4] = 5; cmdsend( senddata ); while(1){;} } void cmdsend(unsigned int * info) { unsigned int k; for (k = 0; ((*info) != '\0') && (info != NULL); *info++, k++) printf("senddata is %d\r\n", *info); } 如上面程序所示,我想将数组sendata完整的输出,现在只能打印出8,2.即在sendata[2]处结束,好像判断为 info == NULL了,请问应该怎样修改,才能输出完整数组?在使用 *info 指针作为形参的前提下。
C语言中指针数组作为函数参数传递的地址问题?
如下代码和结果 指针数据作为函数的形参和实在的时候,形参指针p和实参指针name指向同一个地址是没问题的,可为什么用&去他自身变量的地址的时候取出来的也是同一的地址呢? ``` int main() { void print(char *p[]); char *name[] = { "11111","2222222","33333333" }; printf("name[0]的地址为:%d\n", &name[0]); printf("name[0]指向的地址为:%d\n", name[0]); printf("name[0]的值为:%s\n", name[0]); printf("\n"); printf("\n"); print(name); return 0; } void print(int *p[]) { printf("p[0]的地址为:%d\n", &p[0]); printf("p[0]指向的地址为:%d\n", p[0]); printf("p[0]的值为:%s\n", p[0]); } ``` 下图为输出结果: ![图片说明](https://img-ask.csdn.net/upload/201910/17/1571290590_733033.jpg) 为了区别问题,特写了一个用指针作为参数的函数做了对比,如下: ``` int main() { void print(char *p); int name = 5; int *n; n = &name; printf("n的地址为:%d\n", &n); printf("n指向的地址为:%d\n", n); printf("name的地址为:%d\n", &name); printf("n指向的地址的值为:%d\n", name); printf("\n"); printf("\n"); print(n); return 0; } void print(int *p) { printf("p的地址为:%d\n", &p); printf("p指向的地址为:%d\n", p); printf("p的值为:%d\n", *p); printf("\n"); printf("\n"); } ``` 下图为输出结果: ![图片说明](https://img-ask.csdn.net/upload/201910/17/1571291266_40842.jpg) 为什么这里实参指针n和形参指针p自身地址是不一样的,而上面用指针数据的时候,实参指针数组name和形参指针数组p是一样的。这里有什么区别吗?
C语言中指针作为形参传递数据的问题
我想编写子函数readData读取文件中的数据,主函数中申请空间databuffer用于存储数据。 第一次调用子函数获取数据长度,然后申请空间,再次调用子函数将数据写入以申请的空间中。 但是调试总达不到效果。 代码如下: ``` #include<stdio.h> #include<malloc.h> #define DATAFILE "test.bin" int readBuffer(char * fileName, float *data_buffer,int *data_num) { FILE *data_fp; // float *data_buffer; int data_size; int read_num = 0; int check = 1; if (*data_num == 0) { data_fp = fopen(fileName, "rb"); if (data_fp == NULL) { printf("Open data file failed!\n"); getchar(); return -1; } fseek(data_fp, 0, SEEK_END); data_size = ftell(data_fp); *data_num = data_size / sizeof(float); fclose(data_fp); return 0; } while (check) { data_fp = fopen(fileName, "rb"); if (data_fp == NULL) { printf("Open data file failed!\n"); getchar(); return -1; } fseek(data_fp, 0, SEEK_SET); data_size = *data_num * sizeof(float); /* fseek(data_fp, 0, SEEK_END); data_size = ftell(data_fp); fseek(data_fp, 0, SEEK_SET); data_buffer = (float*)malloc(data_size);*/ *data_num = (int *) fread(data_buffer, sizeof(float), data_size/sizeof(float), data_fp); if (*data_num !=data_size/sizeof(float)) { printf("Read data failed!\nTry again now!\n"); read_num++; fclose(data_fp); } else { check = 0; printf("Data read successed!\n"); } if (read_num == 3) { check = 0; printf("we are read data file failed!\nPlease check the program!\n"); } } if (read_num == 3) { getchar(); return -1; } else return 0; } int main() { int error; char *fileName = "test.bin"; float *data_buffer=NULL; int data_num=0; error = readBuffer(fileName,data_buffer,&data_num); if (error != 0) { printf("Get the number of data failed!\n"); return -1; } data_buffer = (float*)malloc(data_num); error = readBuffer(fileName, data_buffer,&data_num); if (data_num==0) { printf("Read data failed!\n"); } return 0; } ```
C语言 初学链表,对&*符号使用感到迷惑
void merge (LNode *C,int x) //删除链表中单个结点 {LNode *p,*q; p=c; /*查找部分开始*/ while(*p.next!= NULL){ if(p->next->data==x) break; p=p->next; /*查找部分结束*/ if(p->next==null) return 0; else{ /*删除部分的开始*/ q=p->next; p->next=p->next->next; free(q); /*删除部分的结束*/ return 1; } } } 在p->next=p->next->next;这个操作中,LNode *C链表中某个结点的指针指向的地址发生了变化,为什么形参中是“LNode *C”而不是“LNode *&C”。如果说只是方法体内的形参发生了改变,链表C本身没有发生改变,那最终链表怎么会有删除的效果。
c语言中数组的指针表示法
数组有数组表达法和指针表达法 假设一个数组double target[5] 当我在函数的形参部分声明这个数组时 我可以写double target[5] 但是用指针表达的时候应该写double * target 我想问的是这里的指针表达法应该是表达了数组首元素的地址 也就是其类型应该是整型 所以不是应该写int * target吗
如图,为什么单链表初始化需要二级指针,而单链表的插入操作不用二级指针?
# 如图![图片说明](https://img-ask.csdn.net/upload/202003/04/1583291800_270710.png),创建单链表时形参head设计成二级指针类型,是因为要改变头指针指向(对吗?)。 # 而单链表的插入操作同样需要改变指针指向,为什么不需要用二级指针?![图片说明](https://img-ask.csdn.net/upload/202003/04/1583292134_425883.png) # 是因为不需要改变头指针指向所以不用传址吗? # 下面这个问题就显示了我的彻底混乱:那为什么插入操作函数里面的指针P改变了指向却不用定义为二级指针类型(这么说对吗)?![图片说明](https://img-ask.csdn.net/upload/202003/04/1583292489_129307.png) # 本来在链表之前我还是会用指针的,一到链表,还加了个二级指针,我就懵了。问题也很混乱,希望有大佬能指导一下。
【C语言】有关数组转置与指针应用的题目,求大佬解答
编写函数实现矩阵(4行4列)的转置。要求函数的实参为数组名,形参为指针形式。
c++语言出栈Pop函数调用时参数&e为什么跟定义时形参不一样,形参是指针啊
函数声明: void Pop(SqStack*s, char* e) { if (s->top == s->base)return; *e = *--(s->top); } 调用: char e; Pop(&s,&e);
关于c语言指向一位数组指针用法的详细解释(C语言程序设计例题)
![图片说明](https://img-ask.csdn.net/upload/201703/22/1490193489_316173.jpg) 书中说形参(pointer是一个指向包含4个元素的一位数组指针这我能理解) 1.但是为什么(score[][4]明明是个二维数组,为什么可以将首地址作为一位数组的指针传进函数里?) 2.还有就是(pt是一个float指针,pointer也是指针为什么要写pt=*(pointer+n)) 下面有我自己打的简易代码,得到的结果是对的,但是不太明白原理,望大佬为我解惑谢谢 ``` #include<stdio.h> using namespace std; int main() { float score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}}; //这个不是个二维数组吗? float *search(float (*pointer)[4],int n); float *p; int i,m; printf("enter:"); scanf("%d",&m); printf("m:%d\n",m); p=search(score,m); for(i=0;i<4;i++){ printf("%5.2f\t",*(p+i)); } return 0; } float *search(float (*pointer)[4],int n){ float *pt; pt=*(pointer+n); /*这里为什么要加*取pointer所指向的元素(pointer不是自己的值就是地址吗)*/ return(pt); } ```
C中指向double型的指针作形参,在运算编译的时候报错,不知道原因?
本题的实现要求用函数实现,主函数只负责进行函数调用。函数的参数要求全部用到的情况是:  用数组名作函数参数;  用指向数组元素的指针变量作函数参数;  用指向一维数组的指针变量作函数参数; 题目:输入两个行、列数相同的矩阵(实际上是二维数组)A、B,以矩阵的方式分别输出A、B;求矩阵的和并输出;求出每个矩阵中的最大值及其位置;求出每个矩阵中绝对值最大的元素及其位置。下面的各要求通过编写函数实现: ① 输入矩阵(实际上是二维数组); ② 输出矩阵; ③ 求出两个矩阵的和。设A=(aij)m×n,B=(bij)m×n,则C=A+B=(cij)m×n,cij= aij+ bij; ④ 求矩阵中的最大值及其位置; ⑤ 求矩阵中绝对值最大的元素及其位置。 # 程序一直没有编译成功 附上报错图 ![图片说明](https://img-ask.csdn.net/upload/201901/06/1546704478_924396.png) ``` #include<stdio.h> #define M 4 #define N 4 int input_A(double a[][N]) { int j,k; printf("Please input A:\n"); for(j=0;j<M;j++) for(k=0;k<N;k++) { scanf("%5d",&a[j][k]); } } int input_B(double b[][N]) { int j,k; printf("Please input B:\n"); for(j=0;j<M;j++) for(k=0;k<N;k++) { scanf("%5d",&b[j][k]); } } int output(double a[][N],double b[][N]) { int j,k; printf("output A:\n"); for(j=0;j<N;j++) { for(k=0;k<N;k++) { printf("%5d",a[j][k]); } printf("\n"); } printf("output B:\n"); for(j=0;j<N;j++) { for(k=0;k<N;k++) { printf("%5d",b[j][k]); } printf("\n"); } } double sum(double *p,double *q,double *c[N]) { int j,k; double sum; for(j=0;j<N;j++) for(k=0;k<N;k++) { c[j][k]=*(*(p+j)+k)+*(*(q+j)+k); } for(j=0;j<N;j++) for(k=0;k<N;k++) { sum=sum+*(*(c+j)+k); } printf("总和为%lf",sum); } int max(double *p,double *q) { double *ma,*mb; int j,k,jm,km; ma=p;mb=q; for(j=0;j<N;j++) { for(k=0;k<N;k++) { if(*(*(p+j)+k)>*ma) { jm=j; km=k; *ma=*(*(p+j)+k); } } } printf("A矩阵中最大值为%lf,位置:%d行%d列\n",*ma,j+1,k+1); for(j=0;j<N;j++) { for(k=0;k<N;k++) { if(*(*(q+j)+k)>*mb) { jm=j; km=k; *mb=*(*(q+j)+k); } } } printf("B矩阵中最大值为%lf,位置:%d行%d列\n",*mb,j+1,k+1); } int abs_max(double a[][N],double b[][N]) { double *ma,*mb; int j,k,jm,km; ma=a[0][0];mb=b[0][0]; for(j=0;j<N;j++) { for(k=0;k<N;k++) { if(((a[j][k]>=0)?a[j][k]:-a[j][k])>*ma) { jm=j; km=k; *ma=a[j][k]; } } } printf("A矩阵中绝对最大值为%lf,位置:%d行%d列\n",*ma,j+1,k+1); for(j=0;j<N;j++) { for(k=0;k<N;k++) { if(((b[j][k]>=0)?b[j][k]:-b[j][k])>*mb) { jm=j; km=k; *mb=b[j][k]; } } } printf("B矩阵中绝对最大值为%lf,位置:%d行%d列\n",*mb,j+1,k+1); } main() { double A[M][N],B[M][N],C[M][N]; input_A(A); input_B(B); output(A,B); sum(A,B,C); max(A,B); abs_max(A,B); } ``` 新手一枚 谢谢大佬们指教 下面是根据评论区大神建议修改后的代码: ``` #include<stdio.h> #define M 4 #define N 4 int input_A(double a[][N]) { int j,k; printf("Please input A:\n"); for(j=0;j<M;j++) for(k=0;k<N;k++) { scanf("%lf",&a[j][k]); } } int input_B(double b[][N]) { int j,k; printf("Please input B:\n"); for(j=0;j<M;j++) for(k=0;k<N;k++) { scanf("%lf",&b[j][k]); } } int output(double a[][N],double b[][N]) { int j,k; printf("output A:\n"); for(j=0;j<N;j++) { for(k=0;k<N;k++) { printf(" %5.2lf ",a[j][k]); } printf("\n"); } printf("output B:\n"); for(j=0;j<N;j++) { for(k=0;k<N;k++) { printf(" %5.2lf ",b[j][k]); } printf("\n"); } } double sum(double (*p)[N],double (*q)[N],double (*c)[N]) { int j,k; double sum; for(j=0;j<N;j++) for(k=0;k<N;k++) { c[j][k]=*(*(p+j)+k)+*(*(q+j)+k); } for(j=0;j<N;j++) for(k=0;k<N;k++) { sum=sum+*(*(c+j)+k); } printf("总和为%.2lf\n",sum); } int max(double (*p)[N],double (*q)[N]) { double *ma,*mb; int j,k,jm,km; ma=*p;mb=*q; for(j=0;j<N;j++) { for(k=0;k<N;k++) { if(*(*(p+j)+k)>*ma) { jm=j; km=k; ma=*(p+j)+k; } } } printf("A矩阵中最大值为%lf,位置:%d行%d列\n",*ma,jm+1,km+1); for(j=0;j<N;j++) { for(k=0;k<N;k++) { if(*(*(q+j)+k)>*mb) { jm=j; km=k; mb=*(q+j)+k; } } } printf("B矩阵中最大值为%lf,位置:%d行%d列\n",*mb,jm+1,km+1); } int abs_max(double a[][N],double b[][N]) { double *ma,*mb; int j,k,jm,km; ma=&a[0][0];mb=&b[0][0]; for(j=0;j<N;j++) { for(k=0;k<N;k++) { if(((a[j][k]>=0)?a[j][k]:-a[j][k])>*ma) { jm=j; km=k; ma=&a[j][k]; } } } printf("A矩阵中绝对最大值为%lf,位置:%d行%d列\n",*ma,jm+1,km+1); for(j=0;j<N;j++) { for(k=0;k<N;k++) { if(((b[j][k]>=0)?b[j][k]:-b[j][k])>*mb) { jm=j; km=k; mb=&b[j][k]; } } } printf("B矩阵中绝对最大值为%lf,位置:%d行%d列\n",*mb,jm+1,km+1); } main() { double A[M][N],B[M][N],C[M][N]; input_A(A); input_B(B); output(A,B); sum(A,B,C); max(A,B); abs_max(A,B); } ``` 可以_正常运行_
这几段代码我有点理解不了(数据结构c语言),求大神给我讲解一下。
在自学数据结构时遇到了困难,来求助大家了。 ``` #define MAXSIZE 10000 typedef struct { char no[20]; char name[50]; float price; }Book; typedef struct { Book *elem; //这个是定义了谁的指针?为什么这样定义? int length; }sqList SqList L; Status InitList(SqList &L)//形参是结构体是怎么传递的,为什么L前面还有取地址符&; { L.elem=new ElemType[MAXSIZE];//这句话是什么意思? if(!L.elem) exit(OVERFLOW); L.length=0; return OK; } ``` 谢谢
c语言 排序题(指针) 指针我学的不是很好,请问我的代码哪里有问题?
描述 将输入的四个整数按由大到小的顺序输出。 已定义如下swap函数,可实现形参pa和pb所指内存单元的内容交换。请务必使用本函数实现两个变量内容的互换。 void swap( int *pa, int *pb) { int t; t=*pa; *pa=*pb; *pb=t; } 输入 输入包含多组数据,每组输入4个整数,用空格隔开。 输出 根据每组输入,输出排序后的4个整数,由空格隔开。输出占一行。 样例输入 4 3 5 2 样例输出 5 4 3 2 我的代码: #include <stdio.h> void swap(int *pa,int *pb) { int t; t=*pa; *pa=*pb; *pb=t; } int main() { int ar[4],index,min,i,j,a,b; while(scanf("%d%d%d%d",&ar[0],&ar[1],&ar[2],&ar[3])!=EOF) { for(i=0;i<3;i++) { index=i; min=ar[i]; for(j=i;j<3-i;j++) { if(ar[index]>ar[j]) { a=ar[index]; b=ar[j]; swap(a,b);//函数的调用 } } } printf("%d %d %d %d\n",a[0],a[1],a[2],a[3]); } return 0; }
C语言函数不能返回局部变量或者形参的地址?为什么
#include <stdio.h> int *func(int x,int y,int z) /*返回地址值的函数*/ { int max; if(x>=y&&x>=z) return(&x); if(y>=x&&y>=z) return(&y); return(&z); } main() { int a,b,c,*p; printf("\nPlease input a,b,c:\n"); scanf("%d%d%d\n",&a,&b,&c); p=func(a,b,c); printf("a=%d,b=%d,c=%d,*p=%d\n",a,b,c,*p); } 例如这题, ``` ```
创建及遍历线索二叉树,出了一些小问题
不知道哪里出了问题 创建为先序创建 线索化及遍历都是中序 不知道为什么跑不出来 ``` #include<stdio.h> #include<stdlib.h> #include<string.h> //原二叉链表中添加ltag和rtag //ltag 0表示lchild指向左孩子 1表示lchild指向结点前驱 //rtag 0表示rchild指向右孩子 1表示rchild指向结点后继 /*建立线索化二叉树实质上是遍历一棵二叉树,在遍历过程中检查左右指针域 是否为空,若为空,将指针改为前驱结点或者后继结点的线索*/ enum Ptag{Link,Thread}; //Link(0) Thread(1) typedef char ElemType; typedef struct BiTNode { ElemType data; struct BiTNode *lchild, *rchild; Ptag ltag,rtag; }BiTNode,*BiTree; BiTree pre=NULL; //全局变量 void TThread(BiTree p) //P为根结点的二叉树中序线索化 { //每次判断当前访问节点的ltag和上一次访问节点rtag if(p!=NULL) { TThread(p->lchild); if(p->lchild==NULL){ p->ltag=Thread; p->lchild=pre; } else p->ltag=Link; if(pre->rchild==NULL){ pre->rchild=p; pre->rtag=Thread; } else pre->rtag=Link; pre=p; TThread(p->rchild); } } BiTree CreatTree(BiTree bt) //对bt根结点的二叉树线索化 增加一个头结点head { BiTree head; head=(BiTree)malloc(sizeof(BiTNode)); head->ltag=Link; head->rtag=Thread; head->rchild=bt; if(bt==NULL) head->rchild=head; else{ head->lchild=bt; pre=head; TThread(bt); pre->rchild=head; pre->rtag=Thread; head->rchild=pre; } return head; } void createBiTree(BiTree *T) //若传值为BiTree T,形参传递而不是实参传递 { ElemType ch; scanf("%c",&ch); getchar(); // fflush(stdin); if (ch=='#') { *T = NULL; return; } else { *T = (BiTree)malloc(sizeof(BiTNode)); if (!*T) exit(1); (*T)->data=ch; printf("请输入左子树:\n"); createBiTree(&((*T)->lchild)); //左 printf("请输入右子树:\n"); createBiTree(&((*T)->rchild)); //右 } } BiTree InFirst(BiTree Bt) //寻找中序遍历第一个结点 { BiTree p=Bt; if(!p) return(NULL); while(p->ltag==0){ p=p->lchild; } return p; } BiTree InNext(BiTree p) //寻找当前结点的后继结点 { BiTree Next; if(p->rtag==1) Next=p->rchild; else{ BiTree q=NULL; for(BiTree q=p->rchild;q->ltag==0;q=q->lchild); Next=q; } return Next; } void VisitBt(BiTree p) //遍历中序线索二叉树 { BiTree q=InFirst(p); while(q){ printf("%d\n",q->ltag); // printf("aaaaaaaaaaaaaaaaaaaaaa\n"); q=InNext(q); } } int main() { BiTree T,Tree; createBiTree(&T); Tree=CreatTree(T); VisitBt(Tree->lchild); return 0; } ``` 求帮助 wan'fen'gan'xie
C语言中关于值传递、地址传递和引用传递的区别
大多数人都知道,使用值传递对形参的更改不会影响实参,但是地址传递和引用传递却会, 最经典的例子莫过于交换两个数字。 但是,为什么在使用值传递的时候,传递一个地址给行参依然没有影响到实参了,是因为改变只在函数内部,没有返回给调用函数吗? 比如,下面关于二叉树的建立和遍历 ``` #include <iostream> using namespace std; #define none '#' typedef char TelemType; typedef struct Binode{ TelemType data; // 数据域 struct Binode *left,*right; // 左右孩子指针 }Binode,* Bitree; // 按先序输入建立二叉树 int createBiTree(Bitree& T){ TelemType ch; scanf("%c",&ch); if(ch == none ) T = NULL; // 用#表示空节点 else{ T = new Binode; T->data = ch; createBiTree(T->left); // 建立左子树 createBiTree(T->right); // 建立右子树 } return 1; } // 按照先序遍历二叉树 int preOrder(Bitree T){ if(T){ printf("%c ",T->data); // 先遍历根 preOrder(T->left); preOrder(T->right); return 1; } else return 0; } int main(){ Bitree T; createBiTree(T); preOrder(T); return 0; } ``` 在建立二叉树createBitree去掉引用符号&,就建立不起来了?
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
【JSON解析】浅谈JSONObject的使用
简介 在程序开发过程中,在参数传递,函数返回值等方面,越来越多的使用JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,同时也易于机器解析和生成、易于理解、阅读和撰写,而且Json采用完全独立于语言的文本格式,这使得Json成为理想的数据交换语言。 JSON建构于两种结构: “名称/值”对的集合(A Collection of name/va...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
只因接了一个电话,程序员被骗 30 万!
今天想给大家说一个刚刚发生在我身边的一起真实的诈骗经历,我的朋友因此被骗走30万。注:为了保护当事人隐私,部分情节进行了修改。1平安夜突来的电话开始以为就像普通的诈骗一样,想办法让你把钱...
我一个37岁的程序员朋友
周末了,人一旦没有点事情干,心里就瞎想,而且跟几个老男人坐在一起,更容易瞎想,我自己现在也是 30 岁了,也是无时无刻在担心自己的职业生涯,担心丢掉工作没有收入,担心身体机能下降,担心突...
python自动下载图片
近日闲来无事,总有一种无形的力量萦绕在朕身边,让朕精神涣散,昏昏欲睡。 可是,像朕这么有职业操守的社畜怎么能在上班期间睡瞌睡呢,我不禁陷入了沉思。。。。 突然旁边的IOS同事问:‘嘿,兄弟,我发现一个网站的图片很有意思啊,能不能帮我保存下来提升我的开发灵感?’ 作为一个坚强的社畜怎么能说自己不行呢,当时朕就不假思索的答应:‘oh, It’s simple. Wait for me for a ...
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
Java 14 都快来了,为什么还有这么多人固守Java 8?
从Java 9开始,Java版本的发布就让人眼花缭乱了。每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
Idea 中最常用的10款插件(提高开发效率),一定要学会使用!
学习使用一些插件,可以提高开发效率。对于我们开发人员很有帮助。这篇博客介绍了开发中使用的插件。
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
立即提问