对于读取复杂指针声明,有左右规则.
但是这条规则没有提到如何阅读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) 我遇到了这段代码,完全迷失了解释它的含义.
#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:错误:之前的'信号'声明就在这里
现在我知道两种审判都是不正确的申报方式,但为什么它们不正确呢?为什么声明的原始方式不是重新声明?
该代码:
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中使用这种情况......
void(*)(void*)的含义是什么意思?
我在"使用C掌握算法"一书的示例代码中遇到了这种类型
void list_init(List *list, void (*destroy)(void *data))
{
...
...
}
Run Code Online (Sandbox Code Playgroud) 我有一个具有数组属性的对象,比如(*obj).some_array;,其中some_array是一个整数数组.
我知道我们可以像这样简单:
int test = 10;
int &alias = test;
Run Code Online (Sandbox Code Playgroud)
但是,我如何对一个对象的数组进行别名,类似于上面的但是对于obj的some_array?
我有一个测试程序试试这个:
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项目(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 ++中的多维数组声明时遇到问题。
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]结合使用会产生什么?
在你可能已经读过的K&R的C编程语言书中有一个标题相同的部分,"复杂的声明" .我正在阅读这本书并试图用C语言改进自己.在阅读了上面提到的部分之后,我想我无法理解C声明语句的语法背后的逻辑.1,2,3和4来自该部分5和6来自其他页面.
int (*daytab)[13]
daytab:指向int的数组[13]的指针
void (*comp)()
comp:函数返回void的指针
char (*(*x())[])()
x:函数返回指向函数返回char的指针array []的指针
char (*(*x[3])())[5]
x:指向函数的指针的数组[3]返回指向char的数组[5]的指针
typedef int (*PFI)(char *, char *)
创建类型PFI,用于指向返回int的函数(两个char*参数)的指针.语法如何在这里工作?
最后,我的问题是:
我在函数内部遇到了这个结构(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不是数组本身而是指向数组的指针?