相关疑难解决方法(0)

C不是那么难:void(*(*f [])())()

我今天刚看了一张照片,觉得我很感激解释.所以这是图片:

一些c代码

我发现这令人困惑,并想知道这些代码是否实用.我用Google搜索了这张照片,并在 reddit条目中找到了另一张照片,是照片:

一些有趣的解释

那么"螺旋式阅读"是有效的吗?这是C编译器解析的方式吗?
如果对这个奇怪的代码有更简单的解释,那就太好了.
除此之外,这些代码是否有用?如果是这样,何时何地?

一个关于"螺旋规则"的问题,但我不只是询问它是如何应用的,或者是如何用该规则读取表达式的.我也质疑这种表达方式的使用和螺旋规则的有效性.关于这些,已经发布了一些很好的答案.

c parsing pointers function-pointers void-pointers

184
推荐指数
10
解决办法
1万
查看次数

读复杂的const声明的简单规则?

对于读取复杂指针声明,有左右规则.

但是这条规则没有提到如何阅读const修饰语.

例如,在简单的指针声明中,const可以通过多种方式应用:

char *buffer; // non-const pointer to non-const memory
const char *buffer; // non-const pointer to const memory
char const *buffer; // equivalent to previous declartion
char * const buffer = {0}; // const pointer to non-const memory
char * buffer const = {0}; // error
const char * const buffer = {0}; // const pointer to const memory
Run Code Online (Sandbox Code Playgroud)

现在用const指针声明指针怎么样?

char **x; // no const;
const char **x;
char * …
Run Code Online (Sandbox Code Playgroud)

c c++ const declaration

42
推荐指数
2
解决办法
1万
查看次数

这段代码的含义是什么?void(*signal(int sig,void(*func)(int)))(int);

我遇到了这段代码,完全迷失了解释它的含义.

#include <signal.h>
void (*signal(int sig, void (*func)(int)))(int);
Run Code Online (Sandbox Code Playgroud)

第2行代码的详细解释是什么?

我知道void并且int是类型,*func是函数的指针,括号是优先级.但是我仍然没有把(*信号......),(int)和整个事物结合在一起.越详细越好.

可能我已经知道这个宣言的意义/效果了.但我不得不做一些试验来帮助我了解正在发生的事情,如下所示:

  1 #include <signal.h>
  2 void (*signal)(int sig, void (*func)(int));
  3 void (*signal)(int);  // then void (signal)(int) again.
  4 //void (*signal(int sig, void (*func)(int)))(int); //break this line into two lines above
  5
  6 int main(){}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我void (*signal(int sig, void (*func)(int)))(int)分成了两行.对于3号线,我都尝试void (*signal)(int)void (signal)(int),与表明我试图重新声明同样的错误的结果signal:

TestDeclaration.c:2:错误:'signal'重新声明为不同类型的符号/usr/include/signal.h:93:错误:先前'signal'的声明在这里
TestDeclaration.c:3:错误:'signal'重新声明作为不同类型的符号/usr/include/signal.h:93:错误:之前的'信号'声明就在这里

现在我知道两种审判都是不正确的申报方式,但为什么它们不正确呢?为什么声明的原始方式不是重新声明?

c

34
推荐指数
2
解决办法
7067
查看次数

Golang,Go:为什么指针使用星形运算符代替&

代码:

type ByteSlice []byte

func (p *ByteSlice) Append(data []byte) {
  slice := *p
  slice = append(slice, data...)
  *p = slice
}

func main() {
  x := ByteSlice{1, 2, 3}
  y := []byte{4, 5}
  x.Append(y)
  fmt.Println(x)
}
Run Code Online (Sandbox Code Playgroud)

好吧,我理解为什么以及指针如何工作,但我总是想知道为什么我们使用*operator将指针传递给函数.

  • *ptr 是顺从ptr并返回指针ptr中保存的值.
  • &var 返回变量var的地址.

为什么我们不使用&ByteSlice指针传递函数?

我很迷惑.这个函数不是通过指针吗?

根据Go规范(http://golang.org/ref/spec#Pointer_types)

PointerType ="*"BaseType.

BaseType =类型.

这也让我感到困惑.为什么我们使用star(*)运算符来获取变量和解引用指针的指针?看起来我们不会&在C和Go中使用这种情况......

c pointers go

7
推荐指数
1
解决办法
4951
查看次数

什么是void(*)(void*)

可能重复:
"void*(*)(void*)"在c ++中是什么意思?

void(*)(void*)的含义是什么意思?

我在"使用C掌握算法"一书的示例代码中遇到了这种类型

void list_init(List *list, void (*destroy)(void *data)) 
{
...

...
}
Run Code Online (Sandbox Code Playgroud)

c c++ function-pointers

6
推荐指数
1
解决办法
3163
查看次数

别名为数组

我有一个具有数组属性的对象,比如(*obj).some_array;,其中some_array是一个整数数组.

我知道我们可以像这样简单:

int test = 10;
int &alias = test;
Run Code Online (Sandbox Code Playgroud)

但是,我如何对一个对象的数组进行别名,类似于上面的但是对于obj的some_array?

c++

3
推荐指数
1
解决办法
2482
查看次数

C++运算符"*"是左关联的还是右关联的?

我有一个测试程序试试这个:

int main()
{
    int i = 1;
    int* p, q;
    p = &i;
    //q = &i;//q is not pointer
    int* buf[20];//type of element is int*
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(1)我发现q不是指针,所以int *p星号似乎是右关联的.

(2)但是,因为int* buf[20],我发现buf了一个由20个元素组成的数组,每个元素都用int*.所以在第5行中,星号似乎是左关联的.

那么,如何*与表达式的其他部分相关联,左关联或右关联,或应用于其他规则的确切规则是什么?

c++ associative

3
推荐指数
1
解决办法
319
查看次数

***glibc检测到***免费():无效下一个大小(快) - 应该工作?

我正在处理一个现有的c项目(sourceforge上的spglib),我在清理了一些数组初始化后遇到了以下问题:

*检测到glibc* tests/spglibtest:free():下一个大小无效(快):0x08ab46e0***

回溯是:

#0  0xb7fe1424 in __kernel_vsyscall ()
#1  0xb5cfdd61 in raise () from /lib/libc.so.6
#2  0xb5cff5ee in abort () from /lib/libc.so.6
#3  0xb5d397ed in ?? () from /lib/libc.so.6
#4  0xb5d3f7b1 in ?? () from /lib/libc.so.6
#5  0xb5d4052b in ?? () from /lib/libc.so.6
#6  0xb5d441cd in free () from /lib/libc.so.6
#7  0xb6681484 in sym_get_multiplicity (cell=0xbfffe1f0, symprec=0.050000000000000003) at /git/xtalopt-public/src/spglib/symmetry.c:168
#8  0xb6680550 in spg_find_primitive (lattice=0xbfffe2a8, position=0x813c6f0, types=0x813c700, num_atom=2, symprec=0.050000000000000003)
    at /git/xtalopt-public/src/spglib/spglib.c:253
Run Code Online (Sandbox Code Playgroud)

错误发生在下面的"免费(反式)"行中:

int sym_get_multiplicity(const Cell *cell, const double symprec)
{
  int …
Run Code Online (Sandbox Code Playgroud)

c arrays glibc

2
推荐指数
1
解决办法
2万
查看次数

C ++中多维数组声明的含义

我在理解C ++中的多维数组声明时遇到问题。

static const byte LAYER_SIZE = 3;
static const byte ROWS = 5;
static const byte COLS = 10;

static const byte (*colorMapping[LAYER_SIZE]) [ROWS][COLS];
Run Code Online (Sandbox Code Playgroud)

该声明有什么作用?

特别是部分

(*colorMapping[LAYER_SIZE])
Run Code Online (Sandbox Code Playgroud)

这让我感到困惑-这是什么意思,与[ROWS] [COLS]结合使用会产生什么?

c++

2
推荐指数
1
解决办法
67
查看次数

复杂的声明(C)

可能重复:
如何理解复杂的函数声明?
螺旋规则和'声明跟随用法'用于解析C表达式

在你可能已经读过的K&R的C编程语言书中有一个标题相同的部分,"复杂的声明" .我正在阅读这本书并试图用C语言改进自己.在阅读了上面提到的部分之后,我想我无法理解C声明语句的语法背后的逻辑.1,2,3和4来自该部分5和6来自其他页面.

  1. int (*daytab)[13] daytab:指向int的数组[13]的指针

  2. void (*comp)() comp:函数返回void的指针

  3. char (*(*x())[])() x:函数返回指向函数返回char的指针array []的指针

  4. char (*(*x[3])())[5] x:指向函数的指针的数组[3]返回指向char的数组[5]的指针

  5. typedef int (*PFI)(char *, char *) 创建类型PFI,用于指向返回int的函数(两个char*参数)的指针.语法如何在这里工作?

最后,我的问题是:

  • 您能否通过上述示例解释您的思维方式和阅读复杂的声明?
  • 1,3,4这样的东西是否实际可用且需要?如果是这样,你能写一些代码示例吗?

c syntax declaration

1
推荐指数
1
解决办法
962
查看次数

指针声明基础(多维数组指针的赋值)

我在函数内部遇到了这个结构(e是传递给函数的参数):

short (*tt)[][2] = (short (*)[][2])(heater_ttbl_map[e]);
Run Code Online (Sandbox Code Playgroud)

及其用法(其中i是for循环中的计数器):

(*tt)[i][0]
Run Code Online (Sandbox Code Playgroud)

我想我得到了作业的第一部分:

short (*tt)[][2]
Run Code Online (Sandbox Code Playgroud)

据我所知,tt被声明为指向一组短裤阵列的指针.第二部分令我感到困惑,看起来像是某种演员,但我不确定我理解它的作用,尤其是:(*).它是如何工作的?

heater_ttbl_map声明如下(其中pointer1和pointer2都是shortimensional shortet数组):

static void *heater_ttbl_map[2] = {(void*)pointer1, (void*)pointer2};
Run Code Online (Sandbox Code Playgroud)

至于它的使用我理解tt指向的是被解引用(并且它是数组的i索引的第三个索引的内容,这是一个简短的)但是为什么这样写:

(*tt)[i][0]
Run Code Online (Sandbox Code Playgroud)

而不是这样的:

*tt[i][0]
Run Code Online (Sandbox Code Playgroud)

是因为tt不是数组本身而是指向数组的指针?

c c++ arrays pointers

1
推荐指数
1
解决办法
122
查看次数