使用迭代器的代码看起来非常像带指针的代码.迭代器是一些模糊的类型(std::vector<int>::iterator例如).
我没有得到的是迭代器和指针是如何相互关联的 - 迭代器是指针周围的包装器,带有重载操作以前进到相邻元素,还是其他什么?
我有一个函数,我希望能够返回失败和未初始化的特殊值(它返回成功指针).
目前它为失败返回NULL,为未初始化返回-1,这似乎有效......但我可能会欺骗系统.iirc,地址总是积极的,不是吗?(虽然由于编译器允许我将地址设置为-1,这看起来很奇怪).
[更新] 我有另一个想法(如果-1是有风险的)是malloc一个char @全局范围,并使用该地址作为哨兵.
我正在努力使用指针符号*,我发现它在声明和表达式中的使用方式非常混乱.
例如:
int *i; // i is a pointer to an int
Run Code Online (Sandbox Code Playgroud)
但是语法背后的逻辑是什么?*之前的*是什么意思?我们来看下面的例子.请纠正我错在哪里:
char **s;
char *(*s); // added parentheses to highlight precedence
Run Code Online (Sandbox Code Playgroud)
这就是我失去轨道的地方.parantheses之间的*s意味着:s是一个指针?但指针是什么?括号外的*是什么意思:指向s指向的指针?
所以这个意思是:指向s指向的指针是指向char的指针?
我不知所措.*符号在声明和表达式中的解释是否不同?如果是这样,它的解释方式有何不同?我哪里错了?
在我看来,C的箭头操作符( - >)是不必要的.点运算符(.)应该足够了.请使用以下代码:
typedef struct {
int member;
} my_type;
my_type foo;
my_type * bar;
int val;
val = foo.member;
val = bar->member;
Run Code Online (Sandbox Code Playgroud)
我们看到箭头操作符必须用于取消引用栏.但是,我更愿意写
val = bar.member;
Run Code Online (Sandbox Code Playgroud)
关于我是否试图从结构或指针结构中拉出"成员",没有任何歧义.但是使用错误的运算符很容易,尤其是在重构代码时.(例如,也许我正在foo上做一些复杂的操作,所以我将代码移动到一个新函数并将指针传递给foo).我认为我不需要关心foo是否是指针; 编译器可以担心细节.
所以问题是:从C语言中消除 - >不是更简单吗?
我正在尝试使用数组指针作为生成数组的函数的参数.
void generateArray(int *a[], int *si){
srand(time(0));
for (int j=0;j<*si;j++)
*a[j]=(0+rand()%9);
} //end generateArray;
int main() {
const int size=5;
int a[size];
generateArray(&a, &size);
return 0;
} //end main
Run Code Online (Sandbox Code Playgroud)
但是当我编译它时,会出现以下消息:
cannot convert `int (*)[5]' to `int**' for argument `1' to `void generateArray(int**, int*)'
Run Code Online (Sandbox Code Playgroud) 我想通过malloc方法创建一个整数数组.我希望这个数组是全局的,可以在我的程序中的任何地方使用.我把代码放在一个看起来像这样的头文件中:
static int *pieces;
Run Code Online (Sandbox Code Playgroud)
然后我有一个功能,用我想要的数字填充它.该函数位于命名空间中,命名空间在其自己的.cpp文件中实现.但是,我将头文件导入main.c并从创建数组的命名空间调用该函数,如:
pieces = malloc(sizeof(int) * 128);
Run Code Online (Sandbox Code Playgroud)
但是当我尝试访问main中的数组中的数字时(在调用创建我的数组的函数之后),它崩溃并说没有初始化那些碎片.但是在我拥有的功能中,我可以创建它并操纵它中的数字就好了.我的印象是,通过使片段成为静态变量,只要某个函数在任何地方发生变化(或设置它),那么这将影响变量在任何地方的使用.基本上我想说的是为什么片断在主体中显示未设置,即使我将它设置在我调用的函数中?
在C++中,我可以在函数指针和函数引用之间进行选择(或者为了完整性,甚至是函数值):
void call_function_pointer (void (*function)()) {
(*function) ();
}
void call_function_reference (void (&function)()) {
function ();
}
void call_function_value (void function()) {
function ();
}
Run Code Online (Sandbox Code Playgroud)
然而,当谈到方法时,我似乎没有在指针和引用之间做出这种选择.
template <class T> void call_method_pointer (T* object, void (T::*method)()) {
(object->*method) ();
}
// the following code creates a compile error
template <class T> void call_method_reference (T& object, void (T::&method)()) {
object.method ();
}
Run Code Online (Sandbox Code Playgroud)
这使我假设C++中不存在方法引用.真的吗?如果是,他们不存在的原因是什么?
我有一些C代码可以解析来自网络的打包/未打包二进制数据.
这段代码在Intel/x86下运行正常,但是当我在ARM下编译它时,它经常会崩溃.
正如您可能已经猜到的那样,罪魁祸首是未对齐的指针 - 特别是,解析代码会做出如下问题:
uint8_t buf[2048];
[... code to read some data into buf...]
int32_t nextWord = *((int32_t *) &buf[5]); // misaligned access -- can crash under ARM!
Run Code Online (Sandbox Code Playgroud)
......显然不会在ARM-land中飞行,所以我修改它看起来更像这样:
uint8_t buf[2048];
[... code to read some data into buf...]
int32_t * pNextWord = (int32_t *) &buf[5];
int32 nextWord;
memcpy(&nextWord, pNextWord, sizeof(nextWord)); // slower but ARM-safe
Run Code Online (Sandbox Code Playgroud)
我的问题(从语言 - 律师的角度来看)是:我的"ARM修复"方法是否在C语言规则下定义明确?
我担心的是,即使只是有一个misaligned-int32_t指针也可能足以调用未定义的行为,即使我从来没有直接取消引用它.(如果我关心的是有效的,我想我可以修复通过改变问题pNextWord从的类型(const int32_t *)来(const char *)的,但我宁愿不这样做,除非它实际上必须这样做,因为这将意味着做手工一些指针跨度计算)