Tag: 引用

C中的多重引用和解引用

有人可以解释我多重参考和解除引用背后的概念吗? 为什么以下程序将输出设为’h’? int main() { char *ptr = “hello”; printf(“%c\n”, *&*&*ptr); getchar(); return 0; } 而不是这个,而是产生’d’? int main() { char *ptr = “hello”; printf(“%c\n”, *&*&ptr); getchar(); return 0; } 我读到连续使用’*’和’&’相互抵消,但这个解释没有提供上述代码中产生的两个不同输出背后的原因?

为什么不能在函数中修改结构的成员变量?

我很好奇为什么在作为参数传递给函数时不能修改结构的变量。 我知道参数是按值传递的,但是在传递struct变量时,您将其引用作为值传递。 当然,C不会在堆栈上创建结构的副本,因为传入的结构引用的值与将结构的指针传递给函数的值相同。 #include #include typedef struct String { char* name; int x; } String; /* Func Protos */ void foo(String str); void bar(String * str); void banjo(String str); int main() { String str = *(String *)malloc(sizeof(String)); str.x = 5; /* x == 5 */ foo(str); /* x == 5 still */ printf(“%d\n”, str.x); banjo(str); […]

将&var传递给* var和var传递给var有什么区别?

基本上,我想知道为什么这个(将list的内存地址作为参数传递): void init_lista (elemPtr *list) { *list = NULL; } int main(){ elemPtr list; init_list(&list); //[…] } 与此不同(仅传递列表的内容): void init_lista (elemPtr list) { list = NULL; } int main(){ elemPtr list; init_list(list); //[…] } OBS: elemPtr是结构的指针类型( typedef struct elem *elemPtr )。 我从&和*理解的是,第一个将获得var的内存地址,后者将获得它引用的值。 通过这个概念,两个代码段应该是等价的,但第一个运行正常,而第二个编译,但给我一个运行时错误。 这是为什么?

C:将数组(指针)传递给函数

我有一个函数我想有一个函数来接收一个2D数组(H),读取一个指定的列(col)并将其传递给另一个数组(b)。 看来下面的代码不行,我期待得到1打印。 非常感谢任何指导。 #define nline 5 #define ncol 4 #include #include #include #include void count0(int **M,int col, int *a); void main(){ int i; int **H; H=(int**)malloc(nline*sizeof(int*)); for(i=0;i<nline;i++){ H[i]=(int*)malloc(ncol*sizeof(int)); } H[0][0]=8; H[0][1]=5; H[0][2]=6; H[0][3]=0; H[1][0]=7; H[1][1]=5; H[1][2]=4; H[1][3]=0; H[2][0]=5; H[2][1]=1; H[2][2]=1; H[2][3]=7; H[3][0]=0; H[3][1]=0; H[3][2]=0; H[3][3]=2; H[4][0]=1; H[4][1]=0; H[4][2]=1; H[4][3]=4; int *b; int col=1; count0(H,col,&b); printf("num […]

为什么我的小lisp QUOTE不会?

我一直在编写基于minilisp编码的微型迷你lisp, McCarthy论文 (由Lisp的根源修订),并使用基于J Incunabulum的(可能令人反感的)风格。 并从这里使用PP_NARG宏。 我还受到了我以前的项目的激励,这是一个codegolf’ed lambda演算解释器 ,我后来发现它与1999年的ioccc Lisp解释器非常相似,特别是在使用游标而不是指针来指代内存地址时。 它似乎工作,包括读者代码。 但是,虽然eval(ATOM(QUOTE X))正确地产生T ,并且eval(ATOM(QUOTE(XYZ)))正确地产生NIL ,并且eval(QUOTE X)产生X ,并且eval(QUOTE(XYZ))产生(XYZ) ; 奇怪的结果是eval(QUOTE(ATOM(QUOTE X)))产生ATOM ,而不是完整的子表达式ATOM(QUOTE X) 。 我认为这是一个长镜头,我并没有让它变得简单,但任何人都可以帮助我找出引用出错的地方吗? 顺便说一下,与上面的描述不同,解释器仅限于单字符标记,因此QUOTE是Q而ATOM是A ( github ) /*cf. http://www.ioccc.org/1989/jar.2.c http://leon.bottou.org/projects/minilisp http://www.jsoftware.com/jwiki/Essays/Incunabulum http://www-formal.stanford.edu/jmc/recursive/recursive.html http://www.paulgraham.com/rootsoflisp.html https://codegolf.stackexchange.com/questions/284/write-an-interpreter-for-the-untyped-lambda-calculus/3290#3290 */ #include #include #include #include #include #include #include”ppnarg.h” #define R return int*m,*n,msz; tag(x){R x&3;} val(x){R x>>2;} #define ALPHA ‘T’ #define NIL […]

在C中打印“(双引号)”

我正在编写一个C代码,它从文件中读取并生成一个中间.c文件。 为此,我使用fprintf()打印到该中间文件。 我怎么打印” ?

将指针/引用传递给函数

这听起来像是一个愚蠢的问题,但我还在学习C,所以请耐心等待。 🙂 我正在研究K&R(结构)的第6章,到目前为止,这本书已经取得了巨大的成功。 我决定使用结构非常重要,因此在本章的早期就使用了point和rect示例做了很多工作。 我想尝试的一件事是通过指针改变canonrect函数(第2版,第131页),因此返回void 。 我有这个工作,但遇到了打嗝,我希望你们可以帮助我。 我希望canonRect创建一个临时矩形对象,执行其更改,然后重新分配它传递给临时矩形的指针,从而简化代码。 但是,如果我这样做,矩形不会改变。 相反,我发现自己手动重新填充我传入的矩形字段,这确实有效。 代码如下: #include #define min(a, b) ((a) (b) ? (a) : (b)) struct point { int x; int y; }; struct rect { struct point lowerLeft; struct point upperRight; }; // canonicalize coordinates of rectangle void canonRect(struct rect *r); int main(void) { struct point p1, p2; […]

在C中通过引用传递

我试图在C中使用传递引用,以便该函数可以修改传递给它的参数的值。 这是函数签名: int locate(char *name, int &s, int &i) 但是,当我尝试编译它时,我得到这个错误,特指上述行: 错误:在’&’标记之前预期’;’,’,’或’)’ 如果我删除’&’程序将编译,但它显然无法正常工作。 这有什么不对? 如何通过参考工作拨打电话?

在C中通过引用传递数组

我是C的新手,我有一个疑问。 由于C函数创建了它的参数的本地副本,我想知道为什么下面的代码按预期工作: void function(int array[]){ array[0] = 4; array[1] = 5; array[2] = 6; } int main(){ int array[] = {1,2,3}; function(array); printf(“%d %d %d”,array[0],array[1],array[2]); return 0; } 线路输出为4 5 6。 为什么这样做有效而以下情况不然? void function(int integer){ integer = 2; } int main(){ int integer = 1; function(integer); printf(“%d”,integer); return 0; } 在这种情况下,输出仅为1。 简短版本:为什么函数可以修改父变量的值,如果它们作为数组传递? 谢谢你们!

C中“对varName的未定义引用”是什么意思?

我有2个文件: ac和bc 在ac我向位于bc的function发送信号 signal(SIGUSR1,doSomething); 在ac文件的顶部,我有: extern void doSomething (int sig); 但是,当我编译时,我收到一个错误: /tmp/ccCw9Yun.o:在函数main’: ac:(.text+0xba): undefined reference to main’: ac:(.text+0xba): undefined reference to main’: ac:(.text+0xba): undefined reference to doSomething的main’: ac:(.text+0xba): undefined reference to ‘ collect2:ld返回1退出状态 包括以下标头: #include #include #include #include #include #include 我该如何解决?