我编译了64位Windows操作系统的应用程序.应用程序应保存64位地址,我必须决定变量类型,以保存它们.我想长期保存它们.但是sizeof(long) == 4.我在哪里以及如何保存地址
这是我们在课堂上给出的一个例子.有人可以向我解释为什么打印29个地址而不是29"0"(零)?
int num[29]; 是一个为29个整数留出29个地址的数组 - 我得到那个部分,但是在for循环中你不打印那些地址而不是地址本身的值吗?
还有,(num+i)和之间的区别是(num[]+i)什么?
我有点困惑..
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int num[29];
for (int i=0;i<29;i++)
cout << (num+i) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我可以在C++中使用明确指定其内存地址的对象吗?这是因为我为每个实体(对象)分别设置了id.因此,如果我能做到这一点,我将能够通过仅添加指针来遍历所有对象.考虑一下:我有一个内存位置为x的对象.我想用内存位置x +(下一个对象的唯一id)创建下一个对象*K其中K是两个对象之间的恒定间隙(比方说)
在C中编码时的常见情况是编写返回指针的函数.如果在运行期间写入函数内发生某些错误,NULL可能会返回以指示错误.NULL只是特殊的内存地址0x0,除了表示特殊条件的出现之外,它从不用于任何东西.
我的问题是,是否有任何其他特殊的内存地址永远不会用于用户态应用程序数据?
我想知道这个的原因是因为它可以有效地用于错误处理.考虑一下:
#include <stdlib.h>
#include <stdio.h>
#define ERROR_NULL 0x0
#define ERROR_ZERO 0x1
int *example(int *a) {
if (*a < 0)
return ERROR_NULL;
if (*a == 0)
return (void *) ERROR_ZERO;
return a;
}
int main(int argc, char **argv) {
if (argc != 2) return -1;
int *result;
int a = atoi(argv[1]);
switch ((int) (result = example(&a))) {
case ERROR_NULL:
printf("Below zero!\n");
break;
case ERROR_ZERO:
printf("Is zero!\n");
break;
default:
printf("Is %d!\n", *result);
break;
}
return 0; …Run Code Online (Sandbox Code Playgroud) 我在txt文件中有内存位置地址.我想从文件中读取地址并使用存储在该地址的值.这就是我所做的:
char line[10];
FILE *f;
f=fopen("p:\\address.txt", "r");
fgets(line,10,f);
Run Code Online (Sandbox Code Playgroud)
该文件包含地址0x12ff30.我已将其存储在char数组行中.地址包含一个double值(来自0x12ff30的8个字节).现在如何创建和使用指针来获取存储在该地址的值?
谢谢.
说我们有一个变量
int var = 3000;
int *pt;
pt=2293572; //where &var=2293572
Run Code Online (Sandbox Code Playgroud)
通过了解内存地址,问题基本上是间接访问存储在内存位置的值? 如果不是在c,cpp我们可以使用其他语言吗?
这是我的代码:
#include <iostream>
using namespace std;
int main()
{
void *x;
int arr[10];
x = arr;
*x = 23; //This is where I get the error
}
Run Code Online (Sandbox Code Playgroud)
如您所见,代码非常简单.它只是创建一个void指针x,它指向数组'arr'的内存地址,并将整数23放入该内存地址.但是当我编译它时,我收到错误消息"'void*'不是指向对象的指针类型".当我使用'int'指针而不是void指针然后编译它时,我没有得到任何错误或警告.我想知道为什么我会收到这个错误.
谢谢.
我在buf0buf.cc这里读了mysql的innodb缓冲区源代码的代码:
我得到了这个:
&buf_pool->watch[0]
声明的价值是什么?地址?或其他价值?
代码是什么意思?(语法含义)
请解释为什么下面的代码失败了line 10.如何打印p,即Hello World.
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
char ar[200] = "Hello World";
strcat(ar, " !");
printf("%s\n", ar);
char **p = &ar;
printf("%s\n", *p[0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
只是为了澄清我想要实现的目标.我有一个接受char**作为参数的函数,因此我想转换char ar[200]为char**,但应用程序冻结.
我一直以为:
char a[10];
char* p = &a;
Run Code Online (Sandbox Code Playgroud)
是错的,它应该是以下之一:
char a[10];
char* p = a; // OR
char* p = &a[0];
Run Code Online (Sandbox Code Playgroud)
我希望我能找到这里的主题,所以我正在阅读说p =&a; 是有效的,它是关于C语言,而不是C++.
我一直在想,显然:
char* p = new char[10];
char* p1 = &p; // Is wrong
Run Code Online (Sandbox Code Playgroud)
但是,当一个数组在堆栈空间为本地创造了它似乎是合理的我的直觉a,&a和&a[0]都是相同的值/地址.我不得不说,我一直在关注C++并且没有看到它以这种方式完成,这就是为什么当我开始研究CI时很快将其称为错误,但我确信它不在C中(很好地验证)在那将是赞赏).我只是想知道C++中的情况是否也是如此,因为据我所知,在C++中通常会采用其他两种方式中的一种,这种方式(如果我的想象力不是耍花招)似乎是用C语言完成的.
编辑:这是一个非常愚蠢的问题.我的困惑来自于我的Visual Studio编译器在C中编译它,但不是在C++中编译,所以我认为在这方面语言有所不同.我不会删除这个问题,因为它已经有了答案.
memory-address ×10
c++ ×7
c ×6
pointers ×6
arrays ×3
64-bit ×1
codeblocks ×1
dereference ×1
for-loop ×1