假设我有一个C++类,如下所示:
class Point {
// implementing some operations
}
Run Code Online (Sandbox Code Playgroud)
然后:
Point p1;
Point p2 = p1;
Run Code Online (Sandbox Code Playgroud)
如果我想知道p2的地址,那么我可以使用&p2.但是如何获得p2存储的地址?因为p2不是指针,所以我不能只使用cout << p2;
我想基本上做以下(这可能是危险的,不是什么)只是为了它:
int main() {
int x = 0x00ff00ff;
printf("Value at addr x: %x\n",*x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
基本上看一下我机器中某个地址的内容.也许写信给它.我猜我不允许做后者.
我得到的错误是error: invalid type argument of 'unary *'.
有没有办法做到这一点?
#include<stdio.h>
int swap(int *a,int *b);
int main()
{
int a=10,b=20;
swap(&a++,&b++);
printf("a=%d\nb=%d",a,b);
return 0;
}
int swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
Run Code Online (Sandbox Code Playgroud)
为什么这个函数会给出错误"一元中的无效左值"和"?"?正常swap(&a,&b)工作正常,但swap(&a++,&b++)也有swap(&(a++),&(b++))错误.这背后的原因是什么?
代码1:
int main(){
int a=1;
int b=2;
cout << "&a: "<<&a << endl;
}
Run Code Online (Sandbox Code Playgroud)
输出1:
&a: 0x22ff48
Run Code Online (Sandbox Code Playgroud)
代码2:
int main(){
int a=1;
int b=2;
cout << "&a: "<<&a << endl;
cout << "&b: "<<&b << endl;
}
Run Code Online (Sandbox Code Playgroud)
输出2:
&a: 0x22ff4c
&b: 0x22ff48
Run Code Online (Sandbox Code Playgroud)
所以我的问题是为什么a当我打印出varibale的地址时,varibale的地址发生了变化b?
我正在努力提高解析器的速度.并且switch-case,有时它很有用,但我发现它仍然很慢.不确定 - 如果C++支持此功能(地址检查点(带附加参数)),那就太棒了!
简单的例子:
enum Transport //MOTORBIKE = 1, CAR = 2, ... SHIP = 10
Transport foo = //unknown
switch(foo)
{
case MOTORBIKE : /*do something*/ break;
case CAR : /*do something*/ break;
//////////////////////////
case SHIP : /*do something*/ break;
}
Run Code Online (Sandbox Code Playgroud)
如果变量foo是SHIP,至少程序必须重新检查该值最多十次! - >它仍然很慢.
如果C++支持检查点:
Transport foo = //unknown
__checkpoint smart_switch;
goto (smart_switch + foo); //instant call!!!
smart_switch + MOTORBIKE : /*do something*/ goto __end;
smart_switch + CAR : /*do …Run Code Online (Sandbox Code Playgroud) 我的意思是,为什么这个数字与控制台相同?
#include <stdio.h>
int main()
{
char localarr[99];
printf("%d\n",(int)localarr);
printf("%d\n",(int)&localarr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,localarr的地址实际上并没有存储在任何变量中.但是生成的代码可以存储在幕后,或者至少gcc可以发出警告,而不是在我将此类函数传递给期望char**的函数时允许段错误.为什么我们有这种行为?
相关:为什么
char **ppl = &localarr;
Run Code Online (Sandbox Code Playgroud)
结果是:
error: cannot convert ‘char (*)[99]’ to ‘char**’
Run Code Online (Sandbox Code Playgroud)
?
以下是什么意思?
class Something
{
public:
int m_nValue;
const int& GetValue() const { return m_nValue; }
int& GetValue() { return m_nValue; }
};
Run Code Online (Sandbox Code Playgroud)
此代码取自此处.
如果我在OS X上运行以下命令:
int main (void)
{
int* n; // initialise(declare) pointer
*n = 20; // the value in address pointed to by n is 20
printf("n: %i, n&: %i\n", n, &n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
n:1592302 512,n&:1592302 480
为什么不同的价值观?
char testChar = 'a';
char myCharString[] = "asd";
char *pointerToFirstChar = &(myCharString[0]);
char *pointerToSecondChar = &(myCharString[1]);
cout << "A char takes " << sizeof(testChar) << " byte(s)";
cout << "Value was " << pointerToFirstChar << ", address: " << &pointerToFirstChar << endl;
cout << "Value 2 was " << pointerToSecondChar << ", address:" << &pointerToSecondChar << endl;
Run Code Online (Sandbox Code Playgroud)
这个输出:
"一个字符需要1个字节"
"......地址:00F3F718"
"......地址:00F3F70C",
我认为地址之间的区别应该是1个字节,因为这将是分隔它们的数据的大小.为什么不是这样?
我尝试使用指针来玩一些指定值'i'和我发现的内容,因为有两个不同的地址分配给声明%u和%lu,%llu.变量如何可能在同一个执行实例中具有两个不同的地址 -
#include <stdio.h>
int main(void)
{
int i;
float f;
printf("\nEnter an integer:\t");
scanf("%d",&i);
printf("\nValue of address of i=%u",&i);
printf("\nvalue of address of i=%d",&i);
printf("\nValue of address of i=%lu",&i);
printf("\nValue of address of i=%llu",&i);
printf("\nvalue of i=%d",i);
printf("\nvalue of i=%u",i);
printf("\nvalue of i=%lu",i);
printf("\nvalue of i=%llu\n",i);
}
Run Code Online (Sandbox Code Playgroud)
这是输出 -
aalpanigrahi@aalpanigrahi-HP-Pavilion-g4-Notebook-PC:~/Desktop/Daily programs/pointers$ ./pointer001
Enter an integer: 12
Value of address of i=1193639268
value of address of i=1193639268
Value of address of i=140725797092708
Value of address of i=140725797092708
value of i=12 …Run Code Online (Sandbox Code Playgroud)