有什么区别
你能给我一些例子吗?
我已经看过它多次断言现在C++标准不允许使用以下代码:
int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];
Run Code Online (Sandbox Code Playgroud)
&array[5]在这种情况下是合法的C++代码吗?
如果可能的话,我想要一个参考标准的答案.
知道它是否符合C标准也很有趣.如果它不是标准的C++,为什么决定做出从不同的治疗呢array + 5还是&array[4] + 1?
为什么以及如何解除引用函数指针只是"什么都不做"?
这就是我所说的:
#include<stdio.h>
void hello() { printf("hello"); }
int main(void) {
(*****hello)();
}
Run Code Online (Sandbox Code Playgroud)
来自这里的评论:
函数指针解除引用就好了,但生成的函数指示符会立即转换回函数指针
从这里的答案:
解除引用(以你认为的方式)函数的指针意味着:访问CODE内存,因为它将是一个DATA内存.
不应该以这种方式取消引用函数指针.相反,它被称为.
我会使用"dereference"这个名字与"call"并排使用.没关系.
无论如何:C的设计方式是函数名称标识符和变量保持函数的指针都是相同的:地址到CODE内存.它允许通过在标识符或变量上使用call()语法来跳转到该内存.
如何准确地不提领一个函数指针的工作?
我在互联网上阅读不同的东西并感到困惑,因为每个网站都说不同的东西.
谈到C.
我读到了*引用运算符&和解引用运算符; 或者引用意味着使指针指向变量,并且解除引用正在访问指针指向的变量的值.所以我很困惑.
我是否可以获得有关"引用和取消引用"的简单但彻底的解释?
对于我正在研究的太空入侵者游戏,我遇到了一个非常奇怪的问题.基本上我收到访问冲突错误:
SpaceInvaders.exe中0x5edad442(msvcr100d.dll)的未处理异常:0xC0000005:访问冲突读取位置0x00000000.
当我在下面包含这段代码时.visual studio在调试时带我去"strcmp.asm".请注意,我没有在任何代码中使用strcmp().代码有什么问题,或者这个问题是否超出了我所包含的范围?谢谢你的帮助
const char* invarray[] = {"invader0.png", "invader1.png", "invader2.png", "invader3.png", "invader4.png"};
int i=0;
//Creates 55 invaders
for (int y=0; y<250; y+=50){
for (int x=0; x<550;x+=50){
Invader inv(invarray[y/50], x+50, y+550, 15, 15, 1, false, 250);
invaders[i] = inv;
}
}
Run Code Online (Sandbox Code Playgroud)
Invader构造函数:
Invader::Invader(const char *pic, int x, int y, int w, int h, bool dir, bool des, int point) : MovingObject(pic, x, y, w, h) , direction(dir), destroyed(des), b(0), points(point){};
Run Code Online (Sandbox Code Playgroud)
MovingObject构造函数
MovingObject::MovingObject(const char *pic, int x, int y, int w, …Run Code Online (Sandbox Code Playgroud) 我知道这是非常基本的,但对我来说有点混乱.
我读了:
一个指针只不过是一个多地址,并且指针变量只是可变量存储地址.
当我们将变量的地址存储i在指针变量中时p,我们说它p指向i.
int i, *p = &i;
Run Code Online (Sandbox Code Playgroud)
p指向i.
为了访问指针指向的对象,我们使用*(间接)运算符.
如果
p是指针则*p表示p当前指向的对象.
现在我很困惑,我应该调用什么p- 指针或指针变量?
附加:指针是否始终与地址相同?
我是C的新手.我需要通过以下代码了解屏幕上打印的每个值的含义:
#include<stdio.h>
int main()
{
int x = 10;
int *ptr = &x;
printf("%d %d %d\n", *ptr,**&ptr, 2**ptr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出(GCC):
10 10 20
Run Code Online (Sandbox Code Playgroud)
在这里,我声明了变量x并ptr指向x变量.所以,*ptr印刷价值x.但我不明白的价值**&ptr和2**ptr.
提前致谢.
我有一个关于增加指针的问题,我不太明白.
让我们看看2个小程序:
int iTuna=1;
int* pPointer= &iTuna;
*pPointer = *pPointer + 1 ; //Increment what pPointer is pointing to.
cout << iTuna << endl;
Run Code Online (Sandbox Code Playgroud)
在第一个程序中,我将pPointer指向的内容增加为"*pPointer =*pPointer +1".正如我所料,iTuna改为"2"并且程序打印出值"2"
int iTuna=1;
int* pPointer= &iTuna;
*pPointer++; //Increment what pPointer is pointing to.
cout << iTuna << endl;
system("PAUSE");
return 0;
Run Code Online (Sandbox Code Playgroud)
在这里,我增加了pPointer指向的增量,这是"*pPointer ++".但是这里iTuna保持为"1"并且程序打印出值"1".虽然我期望这个作为第一个工作,但事实并非如此.
请帮助我,告诉我为什么第二代代码没有像我预期的那样工作以及如何绕过它.
谢谢
我有以下代码片段来理解指针到特定长度的字符数组的工作,使用以下示例代码.
#include <stdio.h>
int main(){
char sports[5][15] = {
"cricket",
"football",
"hockey",
"basketball"
};
char (*sptr)[15] = sports;
if ( sptr+1 == sptr[1]){
printf("oh no! what is this");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如何sptr+1和sptr[1]可以相等?因为第一个意味着增加地址,它sptr由一个存储,第二个意味着获取存储在其中的地址的值sptr + 1.
我目前正在将一些c ++代码翻译成Java,用于Android应用程序.我偶然发现了一些棘手的c ++代码(c ++也不是我的主要语言).下面是c ++代码.此函数计算openCV图像帧中的图像渐变(灰度).
cv::Mat computeMatXGradient(const cv::Mat &mat) {
cv::Mat out(mat.rows,mat.cols,CV_64F);
for (int y = 0; y < mat.rows; ++y) {
const uchar *Mr = mat.ptr<uchar>(y);
double *Or = out.ptr<double>(y);
Or[0] = Mr[1] - Mr[0];
for (int x = 1; x < mat.cols - 1; ++x) {
Or[x] = (Mr[x+1] - Mr[x-1])/2.0;
}
Or[mat.cols-1] = Mr[mat.cols-1] - Mr[mat.cols-2];
}
}
Run Code Online (Sandbox Code Playgroud)
在这个片段中,我不知道如何解释第一个循环中的前两行:
const uchar *Mr = mat.ptr<uchar>(y);
double *Or = out.ptr<double>(y);
Run Code Online (Sandbox Code Playgroud)
这里做了什么,我怎么能把它翻译成Java代码?我查看了'mat.ptr <>()'函数,但这也没有用.(文档可以在这里找到.)关于指针的基本信息(比如这里)我已经读过了,但我仍然没有得到如何阅读上面的行.除了使用的指针,我也不太确定如何处理正在使用的'uchar'类型.这如何转化为Java?
整个代码可以在这里找到. …