Tag: 指针

指针与C ++中的variables速度

在一次求职面试中,我被问到“在C ++中,如何更快速地访问variables,尽pipe是普通的variables标识符或者指针”。 我必须说我对这个问题没有一个很好的技术答案,所以我大肆猜测。 我说访问时间可能会和普通的variables/标识符一样,是一个指向存储值的地址的指针,就像指针一样。 换句话说,就速度而言,它们都具有相同的性能,并且指针只是不同的,因为我们可以指定我们希望它们指向的内存地址。 面试官似乎对我的回答(虽然他没有说什么,只是继续询问别的事情)似乎不是很确信/满意,所以我要来问问我的答案是否准确,如果不是,理论和技术POV)。

什么是正确使用printf来显示用0填充的指针

在C中,我想使用printf来显示指针,并使它们正确排列,我想用0填充它们。 我的猜测是,正确的做法是: printf(“%016p”,ptr); 这工作,但这个海湾合作委员会抱怨以下消息: 警告:与'%p'gnu_printf格式一起使用'0'标志 我已经google了一下,下面的线程是在同一个主题,但并没有真正给出解决scheme。 http://gcc.gnu.org/ml/gcc-bugs/2003-05/msg00484.html 阅读它,似乎gcc抱怨的原因是我提出的语法没有在C99中定义。 但我似乎无法find任何其他方式以标准认可的方式来做同样的事情。 所以这里是双重的问题: 我的理解是正确的,这种行为不是由C99标准定义的? 如果是这样,是否有一个标准的批准,便携式的方式呢?

“引用”和“取消引用”的含义

我在互联网上阅读不同的东西,感到困惑,因为每个网站都说不同的东西。 谈到C. 我读了关于*引用操作符和& dereferencing操作符; 或者引用意味着使指针指向一个variables,而解除引用是访问指针所指向的variables的值。 所以我感到困惑。 我可以得到一个关于“引用和取消引用”的简单但彻底的解释吗?

*&和**在C ++中的含义

我几次在函数声明中find这些符号,但我不知道它们的意思。 例: void raccogli_dati(double **& V, double **p, int N) { int ultimo = 3; V = new double * [N/2]; for(int i=0; i < N/2; i++) { V[i] = new double[N/2], std :: clog << "digita " << N/2 – i << " valori per la parte superiore della matrice V: "; for(int j=i; […]

指向vector的指针

我有一个向量的指针。 现在,我如何通过指针读取vector的内容? 我知道这是一个基本的问题,但我无法find相同的答案(C ++)

C指针算术,没有结构对象

我认为这是不可能在C,但要求validation这一点。 是否有可能在没有这种types的实际variables的结构成员之间进行算术运算? 例如: typedef struct _s1 { int a; int b; int c; } T1; 我想看看“C”成员与结构开始的偏移量。 如果我有变数,这很容易: T1 str; int dist = (int)&str.c – (int)&str; 但是我的结构太大,RAM中没有成员(只在EEPROM中)。 我想做一些地址计算,但不要定义RAM成员。 我可以使用结构指针而不是结构variables(它只需要4字节),但是这个例子对我来说很有意思。

在64位平台上的效率:指针与32位数组索引

Andrei Alexandrescu在他的一个主题演讲中build议,在64位平台上,使用32位数组索引比使用原始指针快: 第16页: http : //www.slideshare.net/andreialexandrescu1/three-optimization-tips-for-c-15708507 在他的Facebook账户上,他更精确地说:“更喜欢数组索引来指针(这个似乎每十年都会颠倒)”。 我已经尝试了很多东西来find差异,但我还没有设法build立任何显示这种差异的程序。 知道安德烈,我不会感到惊讶的是,差距不会超过百分之几,但是如果有人find这样的例子,我会很高兴。 这是我做的一个testing。 我selectn = 5000,足够大,以获得一个体面的时间,足够小,使一切都适合一级caching。 我循环几次,使CPU频率上升。 #include <iostream> #include <chrono> int main(int argc, const char* argv[]) { const int n{5000}; int* p{new int[n]}; // Warm up the cache for (int i{0}; i < n; i++) { p[i] += 1; } for (int j{0}; j < 5; j++) […]

为什么MISRA C指出指针副本可能导致内存exception?

MISRA C 2012指令4.12是“不应该使用dynamic内存分配”。 作为一个例子,文档提供了这个代码示例: char *p = (char *) malloc(10); char *q; free(p); q = p; /* Undefined behaviour – value of p is indeterminate */ 该文件指出: 虽然存储在指针中的值在释放之后保持不变,但在某些目标上,可能指向的存储器不再存在, 并且复制该指针的操作 可能导致内存exception 。 几乎所有的句子,我都可以,但最后。 由于p和q都被分配在堆栈上,指针副本如何导致内存exception?

去,X不执行Y(…方法有一个指针接收器)

关于这个“ X没有实现Y(…方法有一个指针接收器) ”的问题已经有了几个问题,但对我来说,他们似乎是在谈论不同的事情,而不适用于我的具体情况。 所以,我没有把这个问题做得非常具体,而是把它放在一个宽泛而抽象的地方 – 好像有几种不同的情况可以使这个错误发生,有人可以把它总结出来吗? 也就是说,如何避免这个问题,如果发生,有什么可能呢? 谢谢。

减去指针

我被要求描述这些代码行在做大学作业 int main() { int t1[] = {0,0,1,1,1}, t2[] = {0,0,1,1,1}; int *p1 = t1, *p2 = t2; while (!*p1++ || !*p2++); cout << (p1-t1) << endl; cout << (p2-t2) << endl; } 我的意思是,2个inttypes的数组被创build和填充值,2个指针被创build并指向每个数组,然后我开始有麻烦了。 while (!*p1++ || !*p2++); 对我来说这是说0移动*p1的位置一个位置或者0移动*p2的位置一个位置,我对这个假设真的没有信心吗? cout << (p1-t1) << endl; 所以然后我们转到cout ,现在我的意思是,我从t1的位置减去p1的位置,其中p1被while定位, t1指向数组中的第一个位置。 再次我可能是完全错误的我只是学习指针,所以请记住,如果我错了我的假设。