关于指针函数,将指针赋值为函数返回值时......

以下为源码,我照着一本C语言教材打的,定义了两个求较小的数的指针函数,但是输出的值总是很大的数字,而且和赋的值无关,请问这是怎么回事?

#include "pch.h"
#include

int main()
{
int * minp(int *, int *);
int * min(int x, int y);
int a, b, *p,*o;
scanf_s("%d,%d",&a,&b);
p = min(a,b);
printf("%d", *p);
o=minp(&a, &b);
printf("%d", *o);

}
int * min(int x, int y)
{
if (x < y)return(&x);
else return(&y);
}
int * minp(int *x, int *y)
{
int * q;
q = *x < *y ? x:y;
return(q);
}

3个回答

特别注意下,不要返回局部变量的指针,因为局部变量在堆栈上,函数返回,地址就是非法的了。

// Q760646.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <iostream>

#include <stdio.h>

int main()
{
    //int* minp(int*, int*);
    void min(int x, int y, int* p);
    int a, b, * p, * o;
    scanf_s("%d,%d", &a, &b);
    int p1;
    min(a, b, &p1);
    printf("%d", p1);
    //o = minp(&a, &b);
    //printf("%d", *o);

}
void min(int x, int y, int *p)
{
    if (x < y) *p = x;
    else *p = y;
}
//int* minp(int* x, int* y)
//{
//  int* q;
//  q = *x < *y ? x : y;
//  return(q);
//}

图片说明

int * minp(int *, int *);
int * min(int x, int y)

函数指针所指向函数参数类型与定义不一致! int*与int是不一样的!!

weixin_44021742
河水不犯 为什么我运行时输出的值时很大的数呢?
大约一年之前 回复

int * min(int ,int) 这个int * 不是函数指针,只是返回值是指针类型,我按照你的代码敲了一遍,只有scanf_s 改成了scanf ,一个一个输入,
结果并没有什么问题,也没有遇到你说的那个数值很大的问题,其实从函数里传出指针类型没什么问题,只要那块内存没有刚好被占用,数值
应该还是对的。

weixin_44021742
河水不犯 那个只是因为用的vs,输入数值没问题的
大约一年之前 回复
s11811247
s11811247 补充一点,盲猜你scanf_s输入数值的时候格式不对,导致b没有被赋值,所以你的返回值就是一个未被初始化的变量地址,数值也就是很大了
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
函数的的返回值正确(普通类型duoble),但是调用它的地方的赋值操作却失败,也不报错

![可以看到红色函数的返回值](https://img-ask.csdn.net/upload/201706/06/1496746728_766270.png) ![F10之后,赋值竟然失败了,函数其实返回类型也是double](https://img-ask.csdn.net/upload/201706/06/1496746769_944474.png) 不知道是不是堆栈大小有关, 我在别的函数里调用,赋值操作没有问题,但是在这个地方调用赋值操作显示是失败的。还有一点就是这个地方调用函数非常的长,而且是C方式编译的 有没有高手帮忙下,这个问题确实有点奇葩

类中const函数的返回值问题

我写了一个matrix类,其中定义了一个二维指针int **p用来表示这个矩阵,现在我需要些一个下标操作符的重载,但是他会报错。 const int *&matrix::operator[](const int n) const { return p[n]; } 这个函数返回一个一维指针引用。但是我不知道错在哪儿了。 但是如果把返回引用改成返回一维指针本身,也就是如下所示,就没问题了。为什么呢??哪个大神来解释下。 const int *matrix::operator[](const int n) const { return p[n]; }

结构体的函数的指针问题

我在a.h中定义了结构体 typedef struct link_t{ int data; struct link_t* prior; struct link_t* next; }Node_t,Link_t; typedef struct{ void (*destory_link)(Link_t *head); link_t* (*creat_link)(int length); Node_t* (*delete_node)(Node_t *node); Node_t* (*add_node)(Node_t* node,int Pdata); link_t* (*merge_link)(Link_t *head1,Link_t *head2); }link_funs; 在a.c中赋值 const link_funs double_link = { .creat_link = _creat, .merge_link = _merge, .add_node = _add, .delete_node = _delete, .destory_link = _destoryLink }; 在B.c中define #define creat_link(num) double_link.creat_link(num) #define add_node(node) double_link.add_node(node) #define delete_node(node) double_link.delete_node(node) #define destory_link(head) double_link.destory_link(head) #define merge_link(head1,head2) double_link.merge_link(head1,head2) 在工程中只有double_link.destory_link(head)函数指向了定义的结构体。结果我观察发现。结构体中只有destory_link这个函数指针所指的函数的返回值是非指针的。其他几个的返回值都是指针类型的。故其他几个函数连接不上,不可使用。这是怎么回事?

关于函数返回值为char*的问题

char * my_strlwr(char * str) {  if(str == NULL)  return NULL;  char * pStr = str;  for(; *pStr != '\0'; pStr++)  {  if(*pStr >= 'A' && *pStr <= 'Z')  *pStr += 'a' - 'A';  }  return str; } int main(void) {  char sz_buf[100] = "Hello World";  char* sz_buffer; sz_buffer = my_strlwr(sz_buf);//这句就报错了,说是const char *与char* 类型不匹配  printf("sz_buf = %s\n", sz_buf);  printf("sz_buffer = %s\n", sz_buffer);  return 0; } ![图片](https://img-ask.csdn.net/upload/201708/06/1501991080_858867.jpg)

如何实现对指针函数的内容的保护

指针函数的返回值是地址值,通过取内容符号“*”可以读取到其地址值指向的内容, 但通过赋值运算却不能改变该地址内的值; 请问这一机制是如何实现的? 用例子说明 int * fun(){int a=10;return a;} cout<<*fun()<<endl; *fun()=20; cout<<*fun<<endl; 输出结果都为10;赋值运算并没有改变*fun()内的值。

关于返回函数内部new分配的内存的引用

#include <iostream> using namespace std; class example { public: example() { num = new int; *num = 10; cout<<"num = "<<*num<<endl; cout<<"构造"<<endl; } ~example() { cout<<"析构"<<endl; delete num; } void pingfang() { *num *= *num; } void print() { cout<<*num<<endl; } private: int *num; }; example & diaoyong1() { example * p = new example; p->pingfang(); return *p; } example * diaoyong2() { example * p = new example; p->pingfang(); return p; } int main(void) { example & e1 = diaoyong1(); e1.print(); delete &e1; example * ptr = diaoyong2(); ptr->print(); delete ptr; getchar(); return 0; } char *&alloc(){ char *va = new char [100]; return va;} 对于这样的程序 执行过程为 进入函数alloc 为变量va分配内存 假设为0x12345678 大小为四个字节 (32位机指针) 执行new操作 在内存0x12345678地址存入申请到的内存地址 假设为0x45670abc 也就是说 *(0x12345678)=0x45670abc 以上部分应该很好理解 然后返回va 也就是返回上一层一个值 这个值不可能是悬空的 它需要一个地址来存 由于是引用返回,所以返回的地址实际上就是变量va的地址0x12345678 退出函数 释放临时变量 包括va的地址0x12345678 返回到主调函数,使用返回值 比如赋值 a=alloc(); 相当于执行操作 a=*(0x12345678) 注意 在上一步 这个地址已经被释放了 所以当前这个地址存的是什么东西是不确定的 可能还是0x45670abc 也可能已经有了变化 这样a的值就不一定是你需要的了 结果也就可能是错的 关键在于退出函数 释放内存 使用内存这步 先释放 后使用 于是出错 如果是全局/静态变量 自然不会有这个问题 因为内存依旧被原来变量占用 类似引用做参数也是同样的效果 example & diaoyong1() { example * p = new example; p->pingfang(); return *p; } example * diaoyong2() { example * p = new example; p->pingfang(); return p; } 我想问上面的两个函数有什么不同?函数返回值到底是怎么实现的?如果返回一个指针是不是就是将储存这个指针的地址返回回来,函数怎么返回和左值是什么类型是不是有关系?局部变量的指针在函数结束的时候被释放是不是储存这个指针的地址释放了这个指针? example & e1 = diaoyong1(); example * e1 = diaoyong1(); //这两个本质上有什么区别,第一个为什么不会造成内存的泄露?

关于C++中重载赋值操作符(=)返回引用的问题

C++小白一枚,遇到一个问题,查了很多资料还是没有想明白。 书上都说C++在重载赋值操作符(=)时,应该返回一个引用,这是因为能够实现链式赋值:比如a=b=c=1 但是,返回一个临时变量,会出现什么问题呢? 比如 class A{...};中有一个赋值操作符重载,返回A,原型如下: A operator=(const A &); 定义了几个A类的变量 A a,b,c,d; 然后让a有了完整的成员。执行如下表达式: b=c=d=a <=> b=(c=(d=a)) 当d=a完成后,返回一个临时变量,然后c会调用赋值操作符重载的函数,把内部成员进行拷贝,执行结束后,c获得了d相同的内容,然后(d=a)中返回的d的临时变量 释放了,然后把c的临时变量给b,以此类推。 感觉这个过程也不会有什么问题呀。 为什么一定要返回引用呢? 我的想法:是不是因为返回临时变量,会需要一个临时变量的空间,如果是ADT或UDT,可能造成内存浪费或者效率低下?但是这个方法没有语法层面上的问题? 除此以外:如果有一个移动赋值函数,在链式赋值第二次开始,是不是会调用该移动赋值函数呢?这种情况下,对内存空间和效率有影响吗?

关于C++ 指针new和delete的问题。

![图片说明](https://img-ask.csdn.net/upload/201703/13/1489375726_998219.png) 创建了四个结构体,并为其分配了内存空间,删除delete的代码后算法可以正常运行,加入delete后运行终止,出现上图的报错,希望有人能帮我看一下,非常感谢大家。 ``` #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <iomanip> #include <math.h> #include <ctime> using namespace std; struct POINT3D //顶点的数据结构 { float x; float y; float z; }; struct TRIANGLE //三角面片 { POINT3D *p_pnt[3]; }; struct PART //部件实时数据结构/添加 { char* file; char* name; int tri_num; int p_num; float T[4][4]; TRIANGLE *p_tri[3000]; }; struct PART_0 //部件初始数据结构/添加 { POINT3D *p_pnt_0[25100]; }; PART Tool[10]; PART_0 Tool_0[10]; bool ifbin(const char *fname) //判断是否二进制文件 { bool bin = false; //默认文本文件 FILE *fp; fp = fopen(fname, "r"); if (fp == NULL) { return false; } char s[256]; fgets(s, 256, fp);//读一行 char *q = "solid binary"; int i; for (i = 0; i<12; i++) { if (s[i] != q[i]) break; } if (i<5 || i == 12) { bin = true; //是二进制文件 } else bin = false; fclose(fp); return bin; } bool compare(const char *s, const char *q, int n) { int i = 0; while (i<n) { if (q[i++] != s[i++]) return false; } if (i = n && (s[n] - ' ' == 0 || s[n] - '\n' == 0 || s[n] == NULL)) return true; else return false; } int Triangle_num(char* fname) { FILE *fp; if ((fp = fopen(fname, "r ")) == NULL) { printf("Can't open file"); exit(1); } int npoint = 0; //点个数 int count = 0; //三角面片个数 while (!feof(fp)) //feof()函数为判断文件是否结束,C语言 { char f[256]; fgets(f, 256, fp); if (compare(strtok(f, " "), "vertex ", 6)) { if (++npoint == 3) { count++; npoint = 0; } } } fclose(fp); return count; } void read_stl(int t, const char *filename, int n_triangle)//部件,文件名,三角面片个数 { bool bin; int n_T = 0, n_P = 0; bin = ifbin(filename); if (bin == false) //如果是文本文件 { //n_triangle = Triangle_num(char* filename); //计算三角面片数 //t_p3d *t_p = new t_p3d[n_triangle * 3];//t_p指向点面结构 FILE *fp; if ((fp = fopen(filename, "r")) == NULL) { printf("Can 't open file "); exit(1); } float me[3];//存储顶点的三个坐标值 //int count = 0;//三角面片个数 int count = 0; while (!feof(fp)) { char f[256]; fgets(f, 256, fp);//读一行 if (compare(strtok(f, " "), "vertex ", 6))//以点开始,才能读点 { for (int h = 0; h<3; h++) { me[h] = atof(strtok(NULL, " ")); } (*(*Tool[t].p_tri[n_T]).p_pnt[n_P]).x = (double)me[0]; (*(*Tool[t].p_tri[n_T]).p_pnt[n_P]).y = (double)me[1]; (*(*Tool[t].p_tri[n_T]).p_pnt[n_P]).z = (double)me[2]; (*Tool_0[t].p_pnt_0[count]).x = (double)me[0]; (*Tool_0[t].p_pnt_0[count]).y = (double)me[1]; (*Tool_0[t].p_pnt_0[count]).z = (double)me[2]; count++; if (n_P == 2) //满三个点,三角面片号加1 { n_T++; n_P = 0; } else n_P++; } } fclose(fp); //check(n_pnt, p_pnt, p_pnt0,n_triangle, p_TRIANGLE, t_p,pt1,pt0);//去除冗余点 //delete[] t_p; } } void main() { for (int i = 0; i < 10; i++) { Tool[i].file = new char[1024]; Tool[i].name = new char[1024]; for (int j = 0; j < 3000; j++) { Tool[i].p_tri[j] = new TRIANGLE; for (int k = 0; k < 3; k++) { Tool[i].p_tri[j]->p_pnt[k] = new POINT3D; } } } for (int p = 0; p < 10; p++)//分配Tool_0内存 { for (int q = 0; q < 25100; q++) { Tool_0[p].p_pnt_0[q] = new POINT3D; } } Tool[0].file = "C:\\Users\\Huan\\Desktop\\stl\\12workpiece.STL"; Tool[0].name = "GJ"; Tool[1].file = "C:\\Users\\Huan\\Desktop\\stl\\M1.STL"; Tool[1].name = "M1"; Tool[2].file = "C:\\Users\\Huan\\Desktop\\stl\\M2.STL"; Tool[2].name = "M2"; Tool[3].file = "C:\\Users\\Huan\\Desktop\\stl\\11tool.STL"; Tool[3].name = "M3"; Tool[4].file = "C:\\Users\\Huan\\Desktop\\stl\\D1.STL"; Tool[4].name = "D1"; Tool[5].file = "C:\\Users\\Huan\\Desktop\\stl\\D2.STL"; Tool[5].name = "D2"; Tool[6].file = "C:\\Users\\Huan\\Desktop\\stl\\F1.STL"; Tool[6].name = "F1"; Tool[7].file = "C:\\Users\\Huan\\Desktop\\stl\\F2.STL"; Tool[7].name = "F2"; Tool[8].file = "C:\\Users\\Huan\\Desktop\\stl\\S1.STL"; Tool[8].name = "S1"; Tool[9].file = "C:\\Users\\Huan\\Desktop\\stl\\S2.STL"; Tool[9].name = "S2"; for (int k = 0; k < 10; k++)//计算三角面片数和点数 { Tool[k].tri_num = Triangle_num(Tool[k].file); Tool[k].p_num = Tool[k].tri_num * 3; } for (int i = 0; i < 10; i++)//读取STL文件 { read_stl(i, Tool[i].file, Tool[i].tri_num);//部件,文件名,三角面片个数 } for (int p = 0; p < 10; p++)//删除内存,加入这一段代码之后程序终止 { for (int q = 0; q < 25100; q++) { delete Tool_0[p].p_pnt_0[q]; } } for (int i = 0; i < 10; i++) { for (int j = 0; j < 3000; j++) { for (int k = 0; k < 3; k++) { delete Tool[i].p_tri[j]->p_pnt[k]; } delete Tool[i].p_tri[j]; } delete[] Tool[i].file; delete[] Tool[i].name; } system("pause"); } ```

VS2010中C指针类型转换

写了一段代码无法编译,感觉应该是指针类型转换出了问题,请有经验的程序员帮忙看一看,系统报错如下: error C2440: “=”: 无法从“NODE *”转换为“NODE” 1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换 我的代码如下: #include<iostream> using namespace std; #include<stdio.h> #include<malloc.h> struct node { int num; struct node *link; }; typedef struct node* NODE; void main() { int n, k, m, i,j,a,b; NODE head,q,p; head=(NODE)malloc(sizeof(NODE)); head->link=NULL; scanf("%d,%d,%d",&n,&k,&m); head->num=n; i=n-1; q=head;//q为跟踪节点; while(i) { p=(NODE)malloc(sizeof(NODE));//p为新建节点; p->num=i; p->link=head; head=p; i--; } q->link=head;//建立环装链表完成。 for(j=1;j<=k;j++) { q=q->link; }//q停留在当前要报数的那个人身上。 //接下来开始T人。 for(a=1;a<=n;a++)//开始循环T人 { for(b=1;b<m;b++)//开始找人 { q=q->link; } printf("%d ",q->link->num); q->link=q->link->link; if(a%10==0) printf("\n"); } printf("\n"); } 第一次提问,只有五个币,望大神不吝赐教。

为什么一个const属性的返回值可以用 非const 型来接受呢?

const int func() { int j = 8; return j; } int main() {int i = 5 ;i = func(); } 为什么可以翻译通过呢?

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; } ```

在wxpython中加了按钮,也绑定到了单击的回调函数,但不能正确的回调

main2.py # -*- coding: utf-8 -*- import wx import wx.wizard as wiz import p1 import p2 import p3 import p4 import p5 class MyApp(wx.App): def __init__(self): wx.App.__init__(self) self.appWizard = wiz.Wizard(None, -1, "大都市动态更新向导".decode('utf-8')) self.pageCount = 5 self.InitPages() self.setPagesLink() self.runWizard() def InitPages(self): self.pagesList = list() self.pageFactory = PageFactory() for p in "p1,p2,p3,p4,p5".split(","): self.pagesList.append(self.pageFactory.createPages(p,self.appWizard)) def setPagesLink(self): for i in range(self.pageCount): if 0 < i < self.pageCount: self.pagesList[i-1].SetNext(self.pagesList[i]) self.pagesList[i].SetPrev(self.pagesList[i-1]) def runWizard(self): self.appWizard.FitToPage(self.pagesList[0]) self.appWizard.RunWizard(self.pagesList[0]) self.appWizard.Destroy() class PageFactory(): def createPages(self,pageStr,appWizard): if pageStr == "p1": return p1.p1(appWizard) elif pageStr == "p2": return p2.p2(appWizard) elif pageStr == "p3": return p3.p3(appWizard) elif pageStr == "p4": return p4.p4(appWizard) elif pageStr == "p5": return p5.p5(appWizard) if __name__ == "__main__": app = MyApp() app.MainLoop() ************************************************************************************************************ p1.py # -*- coding: utf-8 -*- import wx import wx.wizard as wiz import wx.lib.filebrowsebutton as filebrowse import os import sys class p1(wiz.WizardPageSimple): configUrl = "" logUrl = "" def __init__(self,appWizard): wiz.WizardPageSimple.__init__(self, appWizard) self.initViews(); def initViews(self): #页标题和分界线 self.pageTitle = wx.StaticText(self,label="设置 Config.ini 和 Log.txt 路径".decode('utf-8')) self.staline = wx.StaticLine(self) #提示字,输入框1,两个按钮 self.confFileUrl = wx.StaticText(self,label="请输入Config.ini的路径".decode('utf-8')) self.fbbh = filebrowse.FileBrowseButtonWithHistory(self,size=(450,-1),changeCallback = self.fbbhCallback) self.fbbh.callCallback = False self.fbbh.SetHistory(["this is history"]) self.fbbhEBtn = wx.Button(self,-1,"打开文件".decode('utf-8')) self.fbbhDBtn = wx.Button(self,-1,"显示".decode('utf-8')) self.Bind(wx.EVT_BUTTON, self.OnClickEbtn1, self.fbbhEBtn) self.Bind(wx.EVT_BUTTON, self.OnClickDbtn1, self.fbbhDBtn) #提示字,输入框2,两个按钮 self.logFileUrl = wx.StaticText(self,label="请输入Log.txt的路径".decode('utf-8')) self.fbbh2 = filebrowse.FileBrowseButtonWithHistory(self,size=(450,-1),changeCallback = self.fbbhCallback2) self.fbbh2.callCallback = False self.fbbh2.SetHistory(["this is history"]) self.fbbhEBtn2 = wx.Button(self,-1,"打开文件".decode('utf-8')) self.fbbhDBtn2 = wx.Button(self,-1,"显示".decode('utf-8')) self.Bind(wx.EVT_BUTTON, self.OnClickEbtn2, self.fbbhEBtn) self.Bind(wx.EVT_BUTTON, self.OnClickDbtn2, self.fbbhDBtn) #Sizer布局 mainSizer = wx.BoxSizer(wx.VERTICAL) topSizer = wx.BoxSizer(wx.VERTICAL) midSizer = wx.BoxSizer(wx.VERTICAL) mid2Sizer = wx.BoxSizer(wx.HORIZONTAL) mid3Sizer = wx.BoxSizer(wx.HORIZONTAL) topSizer.Add(self.pageTitle,flag=wx.ALIGN_CENTER_HORIZONTAL|wx.BOTTOM,border=10) topSizer.Add(wx.StaticLine(self),flag=wx.GROW) mainSizer.Add(topSizer,flag=wx.EXPAND) midSizer.Add(self.confFileUrl) midSizer.Add(self.fbbh) mid2Sizer.Add(self.fbbhEBtn,flag=wx.RIGHT,border=10) mid2Sizer.Add(self.fbbhDBtn) midSizer.Add(mid2Sizer,flag=wx.BOTTOM|wx.CENTER,border=20) midSizer.Add(self.logFileUrl) midSizer.Add(self.fbbh2) mid3Sizer.Add(self.fbbhEBtn2,flag=wx.RIGHT,border=10) mid3Sizer.Add(self.fbbhDBtn2) midSizer.Add(mid3Sizer,flag=wx.CENTER,border=20) mainSizer.Add(midSizer,flag=wx.EXPAND|wx.TOP,border=10) self.SetSizer(mainSizer) def fbbhCallback(self, evt): if hasattr(self, 'fbbh'): value = evt.GetString() if not value: return print value self.configUrl = value history = self.fbbh.GetHistory() if value not in history: history.append(value) self.fbbh.SetHistory(history) self.fbbh.GetHistoryControl().SetStringSelection(value) def fbbhCallback2(self, evt): if hasattr(self, 'fbbh2'): value = evt.GetString() if not value: return print value self.logUrl = value history = self.fbbh2.GetHistory() if value not in history: history.append(value) self.fbbh2.SetHistory(history) self.fbbh2.GetHistoryControl().SetStringSelection(value) def OnClickEbtn1(self,evt): sys.exit() def OnClickDbtn1(self,evt): pass def OnClickEbtn2(self,evt): pass def OnClickDbtn2(self,evt): pass 程序无法进入 def OnClickEbtn1(self,evt)回调函数,请熟悉wxpython的大神帮忙解决,谢谢

基类指针不能指向派生类对象吗

如图,谁能告诉我报错的意思是啥呀 ![图片说明](https://img-ask.csdn.net/upload/201904/13/1555157374_670291.jpg)

为什么函数返回数组的时候需要将数组定义成全局变量,可以定义成局部变量吗?

为什么函数返回数组的时候需要将数组定义成全局变量,可以定义成局部变量吗? ``` int v[10] = { 1,2,3,44,55,66,77,8,9,1 }; auto fun()->int(*)[10] { //int v[10] = { 1,2,3,44,55,66,77,8,9,1 }; return &v; } int main() { auto t = fun(); for (int i = 0; i <= 10; i++) cout << (*t)[i] << endl; } ```

二叉搜索树删除结点时指针问题(邓俊辉数据结构)

新手学习数据结构时遇到了些问题,想请教各位大佬。 在看清华大学邓俊辉网课数据结构 二叉搜索树删除结点时 看到这样一段代码: ``` #define BinNodePosi(T) BinNode<T>*//节点位置 template <typename T> BinNodePosi(T) & BST<T>::search ( const T & e ) { //在BST中查找关键码e if ( !_root || e == _root->data ) { _hot = NULL; return _root; } //在树根v处命中 for ( _hot = _root; ; ) { //自顶而下 BinNodePosi(T) & c = ( e < _hot->data ) ? _hot->lc : _hot->rc; //确定方向 if ( !c || e == c->data ) return c; _hot = c; //命中返回,或者深入一层 } //无论命中或失败,hot均指向v之父亲(或为NULL) } //返回目标节点位置的引用,以便后续插入、删除操作 template <typename T> bool BST<T>::remove ( const T& e ) { //从BST树中删除关键码e BinNodePosi(T) & x = search ( e ); if ( !x ) return false; //确认目标存在(留意_hot的设置) removeAt ( x, _hot ); _size--; //实施删除 updateHeightAbove ( _hot ); //更新_hot及其历代祖先的高度 return true; } //删除成功与否,由返回值指示 template <typename T> static BinNodePosi(T) removeAt ( BinNodePosi(T) & x, BinNodePosi(T) & hot ) { BinNodePosi(T) w = x; //实际被摘除的节点,初值同x BinNodePosi(T) succ = NULL; //实际被删除节点的接替者 if ( !HasLChild ( *x ) ) //若*x的左子树为空,则可 succ = x = x->rc; //直接将*x替换为其右子树 else if ( !HasRChild ( *x ) ) //若右子树为空,则可 succ = x = x->lc; //对称地处理——注意:此时succ != NULL else { //若左右子树均存在,则选择x的直接后继作为实际被摘除节点,为此需要 w = w->succ(); //(在右子树中)找到*x的直接后继*w swap ( x->data, w->data ); //交换*x和*w的数据元素 BinNodePosi(T) u = w->parent; ( ( u == x ) ? u->rc : u->lc ) = succ = w->rc; //隔离节点*w } hot = w->parent; //记录实际被删除节点的父亲 if ( succ ) succ->parent = hot; //并将被删除节点的接替者与hot相联 release ( w->data ); release ( w ); return succ; //释放被摘除节点,返回接替者 } //release()负责释放复杂结构,与算法无直接关系,具体实现详见代码包 ``` 仅讨论第三部分remove_At函数第6行 删除的结点x只有右子树的情况,假设y为x的父节点,并且x是y的右子树,那么第6行只做了x=x->rc仅用子树将其覆盖,为什么不需要将y->rc=x->rc? x的父节点的成员rc,保存的不应该是x的值吗?x变化了,但是y->rc保存的值并没有变吧? 问题大概可以简单概括为,假设y为x右孩子节点(x,y,z为节点指针),z为y右孩子节点。 如果用y=y->rchild,那此时 x->rchild到底变没变? 我的理解是x->rchild应该是原y的值,y被重新赋值后,x->child还是原来的值,没有变。 但这个理解好像错了,请问错在哪?

链表问题,这一句为什么是二级指针

#include "stdio.h" #include "string.h" #include "ctype.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 /* 存储空间初始分配量 */ typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */ typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */ Status visit(ElemType c) { printf("%d ",c); return OK; } typedef struct Node { ElemType data; struct Node *next; }Node; typedef struct Node *LinkList; /* 定义LinkList */ /* 初始化顺序线性表 */ Status InitList(LinkList *L) { *L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */ if(!(*L)) /* 存储分配失败 */ return ERROR; (*L)->next=NULL; /* 指针域为空 */ return OK; } /* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */ Status ListEmpty(LinkList L) { if(L->next) return FALSE; else return TRUE; } /* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */ Status ClearList(LinkList *L) { LinkList p,q; p=(*L)->next; /* p指向第一个结点 */ while(p) /* 没到表尾 */ { q=p->next; free(p); p=q; } (*L)->next=NULL; /* 头结点指针域为空 */ return OK; } /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */ int ListLength(LinkList L) { int i=0; LinkList p=L->next; /* p指向第一个结点 */ while(p) { i++; p=p->next; } return i; } /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */ /* 操作结果:用e返回L中第i个数据元素的值 */ Status GetElem(LinkList L,int i,ElemType *e) { int j; LinkList p; /* 声明一结点p */ p = L->next; /* 让p指向链表L的第一个结点 */ j = 1; /* j为计数器 */ while (p && j<i) /* p不为空或者计数器j还没有等于i时,循环继续 */ { p = p->next; /* 让p指向下一个结点 */ ++j; } if ( !p || j>i ) return ERROR; /* 第i个元素不存在 */ *e = p->data; /* 取第i个元素的数据 */ return OK; } /* 初始条件:顺序线性表L已存在 */ /* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */ /* 若这样的数据元素不存在,则返回值为0 */ int LocateElem(LinkList L,ElemType e) { int i=0; LinkList p=L->next; while(p) { i++; if(p->data==e) /* 找到这样的数据元素 */ return i; p=p->next; } return 0; } /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */ /* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */ Status ListInsert(LinkList *L,int i,ElemType e) { int j; LinkList p,s; p = *L; j = 1; while (p && j < i) /* 寻找第i个结点 */ { p = p->next; ++j; } if (!p || j > i) return ERROR; /* 第i个元素不存在 */ s = (LinkList)malloc(sizeof(Node)); /* 生成新结点(C语言标准函数) */ s->data = e; s->next = p->next; /* 将p的后继结点赋值给s的后继 */ p->next = s; /* 将s赋值给p的后继 */ return OK; } /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */ /* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */ Status ListDelete(LinkList *L,int i,ElemType *e) { int j; LinkList p,q; p = *L; j = 1; while (p->next && j < i) /* 遍历寻找第i个元素 */ { p = p->next; ++j; } if (!(p->next) || j > i) return ERROR; /* 第i个元素不存在 */ q = p->next; p->next = q->next; /* 将q的后继赋值给p的后继 */ *e = q->data; /* 将q结点中的数据给e */ free(q); /* 让系统回收此结点,释放内存 */ return OK; } /* 初始条件:顺序线性表L已存在 */ /* 操作结果:依次对L的每个数据元素输出 */ Status ListTraverse(LinkList L) { LinkList p=L->next; while(p) { visit(p->data); p=p->next; } printf("\n"); return OK; } /* 随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) */ void CreateListHead(LinkList *L, int n) { LinkList p; int i; srand(time(0)); /* 初始化随机数种子 */ *L = (LinkList)malloc(sizeof(Node)); (*L)->next = NULL; /* 先建立一个带头结点的单链表 */ for (i=0; i<n; i++) { p = (LinkList)malloc(sizeof(Node)); /* 生成新结点 */ p->data = rand()%100+1; /* 随机生成100以内的数字 */ p->next = (*L)->next; (*L)->next = p; /* 插入到表头 */ } } /* 随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) */ void CreateListTail(LinkList *L, int n) { LinkList p,r; int i; srand(time(0)); /* 初始化随机数种子 */ *L = (LinkList)malloc(sizeof(Node)); /* L为整个线性表 */ r=*L; /* r为指向尾部的结点 */ for (i=0; i<n; i++) { p = (Node *)malloc(sizeof(Node)); /* 生成新结点 */ p->data = rand()%100+1; /* 随机生成100以内的数字 */ r->next=p; /* 将表尾终端结点的指针指向新结点 */ r = p; /* 将当前的新结点定义为表尾终端结点 */ } r->next = NULL; /* 表示当前链表结束 */ } int main() { LinkList L; ElemType e; Status i; int j,k; i=InitList(&L); printf("初始化L后:ListLength(L)=%d\n",ListLength(L)); for(j=1;j<=5;j++) i=ListInsert(&L,1,j); printf("在L的表头依次插入1~5后:L.data="); ListTraverse(L); printf("ListLength(L)=%d \n",ListLength(L)); i=ListEmpty(L); printf("L是否空:i=%d(1:是 0:否)\n",i); i=ClearList(&L); printf("清空L后:ListLength(L)=%d\n",ListLength(L)); i=ListEmpty(L); printf("L是否空:i=%d(1:是 0:否)\n",i); for(j=1;j<=10;j++) ListInsert(&L,j,j); printf("在L的表尾依次插入1~10后:L.data="); ListTraverse(L); printf("ListLength(L)=%d \n",ListLength(L)); ListInsert(&L,1,0); printf("在L的表头插入0后:L.data="); ListTraverse(L); printf("ListLength(L)=%d \n",ListLength(L)); GetElem(L,5,&e); printf("第5个元素的值为:%d\n",e); for(j=3;j<=4;j++) { k=LocateElem(L,j); if(k) printf("第%d个元素的值为%d\n",k,j); else printf("没有值为%d的元素\n",j); } k=ListLength(L); /* k为表长 */ for(j=k+1;j>=k;j--) { i=ListDelete(&L,j,&e); /* 删除第j个数据 */ if(i==ERROR) printf("删除第%d个数据失败\n",j); else printf("删除第%d个的元素值为:%d\n",j,e); } printf("依次输出L的元素:"); ListTraverse(L); j=5; ListDelete(&L,j,&e); /* 删除第5个数据 */ printf("删除第%d个的元素值为:%d\n",j,e); printf("依次输出L的元素:"); ListTraverse(L); i=ClearList(&L); printf("\n清空L后:ListLength(L)=%d\n",ListLength(L)); CreateListHead(&L,20); printf("整体创建L的元素(头插法):"); ListTraverse(L); i=ClearList(&L); printf("\n删除L后:ListLength(L)=%d\n",ListLength(L)); CreateListTail(&L,20); printf("整体创建L的元素(尾插法):"); ListTraverse(L); return 0; } Status InitList(LinkList *L) { *L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */ if(!(*L)) /* 存储分配失败 */ return ERROR; (*L)->next=NULL; /* 指针域为空 */ return OK; } 形参改写成LinkLis L 传递实参写成InitList(La); 实现的初始化操作没什么区别把 为什么要用二级指针呢, 统一成一级指针不好吗?

c语言课程设计:统计工资

2.1 设计题目 本课程设计要求设计一个公司职员的数据结构,并使用结构指针数组存储职员信息,统计公司员工工资总额和平均工资。 2.2 设计要求 设计要求实现如下功能: (1)使用结构指针数组设计一个公司职员的数据结构,使用下述的结构定义: typedef struct employee{ int age; char *name; double salary; }*PEMP; (2)在主函数里构造一个指针数组company,用来存放职工信息。 (3)设计一个update函数,用来给company赋值。 函数update(company, id, age, name, salary)的四个参数为: company: 结构指针数组 id: company的下标 age: 年龄,整数类型 salary: 薪水,实数 (4)设计一个readin函数,直接采用调用update函数的方式进行赋值。例如:update(company, 2, 30, “LI MING”, 3000.0); (5)编写total函数对工资求和。 这个函数应该能对全体职工和某一年龄段的职工的工资求和。 (6)编写mean函数求平均工资。 这个函数应该能对全体职工和大于某一年龄段的职工的工资求和并计算相应的平均值。 2.3 算法分析 为了简单起见,假设在主函数main中定义结构数组指针如下: PEMP company[num]; 下面说明几个函数的设计问题: (1)readin函数 数组company属于main函数,它是不可见的,所以必须作为readin函数的参数。因为参数传递是传地址的方式,所以不需要返回值。以数据为例,这个函数的定义和使用方法如下: void reading(company) PEMP company[]; { update(company, 2, 23, “张文”,3000.0); update(company, 1, 33, “王微”,2400.0); update(company, 2, 23, “李小”,3055.0); } (2)total函数 它也必须以数组company作为参数,而且要返回工资总额。可将它的原型设计为: double total (PEMP *); total函数应该允许输入年龄范围,如果年龄不合理,应该允许重新输入。对输入数据进行判别,确保无误再进行计算。 for( ; ; ) { printf(“输入年龄范围”); scanf(“%d%d”,&age1, &age2) if(age1>age2) { i=age1; age1=age2; age2=i; } if((age1>=0)&&(age2<=100)&&(age2>=0)&&(age2<=100)&&(age2>age1)) break; } (3)mean函数 mean函数也必须以数组company作为参数,而且要返回平均工资。将它的函数原型设计为: double mean (PEMP *); mean函数应该允许输入年龄范围。对输入字符进行判别,确保无误再进行计算,注意允许大小写。 printf(“求某一年龄段以上的职工的平均工资\n”); printf(“默认是全体职工的平均工资,要改变计算方式请输入Y/y\n”); getchar(); ch=getchar(); if(ch==’Y’||ch=’y’) { printf(“age:”); scanf(“%d”,&age); } (4)申请内存 在update函数中,需要申请内存空间。 PEMP emp If((emp=(PEMP) malloc (sizeof(struct employee)))==NULL)return; 注意emp是指针,所以要使用sizeof(struct employee)。

创建一个类Student。然后在main函数中创建一个对象(“12345”,“张三”,“男”),并调用相应的方法完成数据的输入和输出,使用string类型存储字符串数据。

不知道哪错了,怎么改。 错误提示: 4-1.cpp:(.text+0x1b): undefined reference to `Student::Student()' [Error] ld returned 1 exit status #include"iostream" #include"string" using namespace std; class Student { private: string studentNo; string studentName; string studentSex; public: Student(); void input(){ cout<<"your number,name and sex:"<<endl; cin>>studentNo>>studentName>>studentSex; } void print(){ cout<<"student information:"<<studentNo<<endl<<studentName<<endl<<studentSex<<endl; } }; int main() { Student s; s.input(); s.print(); return 0; }

用ctypes向dll传入的数组,返回python后,其中的数据有时正确有时错误,怎么办?

运行环境: win10 + anaconda5.3 + jupyter python文件 ``` import numpy as np import pandas as pd mylib = ctypes.cdll.LoadLibrary('mydll.dll') C_fun = mylib.func_name C_fun.restypes = None C_fun.argtypes = pass_args_Struct, c_double*10 # pass_args_Struct 是继承ctypes.Structure定义的结构体,代码略 def generate_Struct(data, 其他参数略): # 生成 pass_args_Struct,代码略 # data是个DataFrame,用于接收下面myClass的data属性 class myClass(): # myclass有个data属性,data是一个DataFrame # 其他代码略 def func1(self, x): # 删除self.data的一列,再根据x参数重新添加这一列,代码略 struct_x = generate_Struct(self.data, 其他参数略) myArr = (c_double*10)() C_fun(struct_x, myArr) npArr = np.ctypeslib.as_array(myArr,(10,)) return pd.Series(npArr, _column_names) # _column_names 定义略 def func2(self): # 生成df,df是个只有一列值的DataFrame,代码略 return df.apply(lamba x: self.func1(x[0]), axis=1, result_type='expand')) # 其他代码略 ``` mydll.dll中的代码 ``` #define API extern "C" __declspec(dllexport) typedef pass_args_Struct { // 对应于python中pass_args_Struct,代码略 } API void func_name(pass_args_Struct* x, double arr[]) { // 对arr进行一些操作,代码略 } ``` 在jupyter中: 导入前述Python文件并生成 myObject=myClass() 之后, 执行ret1 = myObject.func1()没什么问题, 但是ret2 = myObject.func2()的结果则有时正确有时错误,错误的时候,ret2中会出现一些NaN值和错误的值。 之前把generate_Struct()定义成myclass的一个方法,连ret1也会出错; 之前的func1(self, x)中采用: ``` func1(self, x): # 其他代码略 myArr = np.ctypeslib.as_array(myArr,(10,)) # 左边不用新名而直接用myArr return pd.Series(myArr, _column_names) ``` 则ret1会频繁出错,基本上是对一次就错一次。 程序一直能运行,只是结果有时不正确。 请教各位大牛,正确的写法是什么样子的? ==================================================== =====2018年11月30日更新==================================== 我可能发现问题了: Python文件TestX.py(放在PYTHONPATH下): ``` import numpy as np from ctypes import Structure, c_double, c_int, POINTER class struct_args(Structure): _fields_ = [('data',POINTER(c_double*2)), ('rows',c_int)] class test(): def __init__(self): self.data = None def get_args_2C(self): arr = np.ascontiguousarray(self.data[['foo','bar']].values, dtype=np.float) rows = c_int(arr.shape[0]) return struct_args(arr.ctypes.data_as(POINTER(c_double*2)), rows) ``` 在jupyter中: ``` import TestX import pandas as pd import numpy as np mydata = pd.DataFrame(np.arange(1600).reshape(800,2),columns=['foo','bar']) # 行数不要太小 mytest = TestX.test() mytest.data = mydata args = mytest.get_args_2C() np.ctypeslib.as_array(args.data,(800,)) ``` 输出的值经常是错误的。 ==================================================== =====2018年12月3日更新==================================== 不知道为什么,但总算是不出错了: python文件: ``` from ctypes import Structure,POINTER,c_double def Struct_A(ctypes.Structure): _fields_ = [(), # 其他成员略 ('my_arr',POINTER(c_double)] # 这个地方用c_double*10后面也会出错 class myClass(): def makeStructA(self, 其他参数): arr = (c_double*10)() SA = Struct_A(……,arr) # 其他成员略 return SA def myMethod(self, 其他参数): SA = self.makeStructA(其他参数) # myCfun是dll中的函数,功能是利用SA中数据进行一些计算,然后把结果写入SA.my_arr,具体代码略 myCfun(SA) ret = pd.Series(np.ctypeslib.as_array(SA.my_arr,(10,)), _columns_name) ret['odd'] = 1 # 这里随便新加点什么就不会出错了 return ret ``` 以上代码如果没有ret['odd']=1那一行,则myObject.myMethod()返回的Series中都是错误的值(看着像是内存未初始化,比如-2.24934335e308之类),而随便给ret添加点什么内容,返回值就是正确的了。 但是在以下计算中仍然会出错,只是出错的频率变小了,而且多运行几次就会正确: ``` class myClass(): # 接上文 def myOptimize(self, arg_name, arg_range): ret = pd.DataFrame({arg_name:arg_range}) _optimize = lambda arg: self.myMethod(**{arg_name:arg[arg_name]}) return ret.join(ret.apply(_optimize, axis=1, result_type='expand')) ``` ===================================== =====2018年12月7日更新==================================== 又出错了!!!12月3日写的: ``` ret['odd'] = 1 # 这里随便新加点什么就不会出错了 ``` 那个函数确实不出错了,但是别的函数用同样的写法(先生成c_double*shape再传入dll在C中写入值)得到的ret无论添加行还是添加列,多运行几次总会出错(内存被清理)。 换一种写法: ``` 略 arr=np.zeros(shape) 略 # 然后传入arr.ctypes.data_as(POINTER(c_double*10)) ``` 目前暂时不出错了。 =====2018年12月13日更新==================================== 前面的写法有问题:用函数生成结构体(比如makeStructA)再传递给dll就会出错,直接将makeStuctA的代码放到myMethod中就不会出错。 另外,传递结构体时用byref就不会出错了,在dll中用malloc给结构体的成员赋值都不会出错。

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

点沙成金:英特尔芯片制造全过程揭密

“亚马逊丛林里的蝴蝶扇动几下翅膀就可能引起两周后美国德州的一次飓风……” 这句人人皆知的话最初用来描述非线性系统中微小参数的变化所引起的系统极大变化。 而在更长的时间尺度内,我们所生活的这个世界就是这样一个异常复杂的非线性系统…… 水泥、穹顶、透视——关于时间与技艺的蝴蝶效应 公元前3000年,古埃及人将尼罗河中挖出的泥浆与纳特龙盐湖中的矿物盐混合,再掺入煅烧石灰石制成的石灰,由此得来了人...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

C++11:一些微小的变化(新的数据类型、template表达式内的空格、nullptr、std::nullptr_t)

本文介绍一些C++的两个新特性,它们虽然微小,但对你的编程十分重要 一、Template表达式内的空格 C++11标准之前建议在“在两个template表达式的闭符之间放一个空格”的要求已经过时了 例如: vector&lt;list&lt;int&gt; &gt;; //C++11之前 vector&lt;list&lt;int&gt;&gt;; //C++11 二、nullptr ...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

深入剖析Springboot启动原理的底层源码,再也不怕面试官问了!

大家现在应该都对Springboot很熟悉,但是你对他的启动原理了解吗?

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

【阿里P6面经】二本,curd两年,疯狂复习,拿下阿里offer

二本的读者,在老东家不断学习,最后逆袭

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

微软为一人收购一公司?破解索尼程序、写黑客小说,看他彪悍的程序人生!...

作者 | 伍杏玲出品 | CSDN(ID:CSDNnews)格子衬衫、常掉发、双肩包、修电脑、加班多……这些似乎成了大众给程序员的固定标签。近几年流行的“跨界风”开始刷新人们对程序员的...

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

我说我懂多线程,面试官立马给我发了offer

不小心拿了几个offer,有点烦

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

立即提问
相关内容推荐