在C中,我们可以在变量前放置"&"来计算出该变量的地址.我有一台32位机器.每当我在控制台中打印地址时,控制台都会显示一个7位数的基数10.我只是想知道这个数字(10 ^ 7)与32位机器有什么关系.(2 ^ 32)谢谢
8086的地址总线为20位宽.这意味着它可以在RAM中寻址1048576个不同的地址.自从最大 8086可以处理的内存为1 MiB,单个内存单元可以存储1个字节.
因此像0xffff0这样的随机逻辑地址具有8位或1字节的"存储".
现代Core i7有一个36位的地址总线,这意味着他可以寻址68719476736不同的地址.每个逻辑地址一个字节,他可以处理68719476736字节或64 GiB,这正是最大值.内存Core i7可以处理.
这个解释是否正确,我认为对吗?
所以自30年以来最大 逻辑内存地址的存储正好是1个字节.
下面是代码
代码:
#include <stdio.h>
int * num(void);
int main(void)
{
int * num2;
num2 =num();
printf("%d\n" , *num2);
return 0;
}
int * num(void)
{
int num = 20;
return #
}
Run Code Online (Sandbox Code Playgroud)
问题:
我们知道,函数num是函数的本地函数num(),所以在这段代码中我尝试num将函数中变量的地址返回给调用它的函数,即main().
之后我只使用解除引用运算符来提取特定num变量的值并将其打印出来main().
有一点我很困惑.我记得我读过一本关于javascript的书,提到变量生命周期在函数内,这意味着在函数完成执行其指令并将控制权传递给调用它的函数之后,函数中每个变量的值将是干净的out(垃圾收集器).但为什么在这段代码中我的main()函数仍然可以指向特定内存地址的值?
这是一个非常基本的概念.但是,我一般都很困惑.帮我.
情况1:
对于以下代码:
int oneDArray[] = {1,2,3};
cout<<&oneDArray<<endl;
cout<<oneDArray<<endl;
cout<<&oneDArray+1<<endl;
cout<<oneDArray+1<<endl;
Run Code Online (Sandbox Code Playgroud)
输出是:
0x28fef4
0x28fef4
0x28ff00
0x28fef8
Run Code Online (Sandbox Code Playgroud)
为什么增量值有差异?
案例2:
int arr[2][3] = {{1,2,3}, {4,5,6}};
cout<<&arr<<endl;
cout<<arr<<endl;
cout<<*arr<<endl;
cout<<&arr+1<<endl;
cout<<arr+1<<endl;
cout<<*arr+1<<endl;
Run Code Online (Sandbox Code Playgroud)
输出是:
0x28fee8
0x28fee8
0x28fee8
0x28ff00
0x28fef4
0x28feec
Run Code Online (Sandbox Code Playgroud)
为什么arr&*arr的输出相同?(内部如何工作)为什么增量值有差异?
我有以下代码:
#include <stdio.h>
char * lookLine (FILE *fichero)
{
char p[25];
fgets (p, sizeof (p), fichero);
return p;
}
int main (void) {
printf ("%s\n", lookLine (fopen ("suma.c", "r")));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
#??x?
Run Code Online (Sandbox Code Playgroud)
不太好.我打算打印出名为"suma.c"的文件的第一行.它应该打印出以下内容:
#include <stdio.h>
Run Code Online (Sandbox Code Playgroud)
不过,如果我将p字符串的内容打印到同一个lookFile函数中,它就可以了:
#include <stdio.h>
void lookLine (FILE * fichero)
{
char p[25];
fgets (p, sizeof (p), fichero);
printf ("%s\n", p);
}
int main (void) {
lookLine (fopen ("suma.c", "r"));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我现在得到的输出是正确的:
#include <stdio.h>
Run Code Online (Sandbox Code Playgroud)
我的理由是:通过使用fgets我保存p数组中第一行"name.c"的字符串,然后返回其地址,该地址由 …
我有以下汇编程序:

我的问题是:为什么地址值在每个过程中都增加3h,有时却仅增加1h,例如:
0010h 0011h 0012h。。。
我开始理解指针以及如何取消引用它们等等.我一直在用ints 练习,但我认为它char会表现得相似.使用*取消引用,使用&访问内存地址.
但在下面的示例中,使用相同的语法来设置a的地址char并将字符串保存到同一个变量中.这是如何运作的?我想我一般都很困惑,也许我正在思考它.
int main()
{
char *myCharPointer;
char charMemoryHolder = 'G';
myCharPointer = &charMemoryHolder;
printf("%s\n", myCharPointer);
myCharPointer = "This is a string.";
printf("%s\n", myCharPointer);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我们实时开发使用ADA语言(ADA95).我们面临着地址绑定机制的问题.在我们使用ADA83之前,其中直接机制是
用于16#12345678#的x;
将地址16#12345678#分配给变量x;但在ADA95中不支持此语法.分配的其他方法是声明变量记录.然后创建一些系统包的对象然后传递地址.这对于想要处理单个变量非常麻烦.此方法仅适用于具有连续存储位置的多个变量,因此您可以为第一个分配地址,其余部分将自动对齐.
TYPE SIU_Type IS
RECORD
SIU_Reserved0 : GLOBAL_TYPE.ORDINAL;
MIDR : GLOBAL_TYPE.ORDINAL;
SIU_Reserved00 : GLOBAL_TYPE.ORDINAL;
END RECORD;
package SIU_Conv is new System.Address_To_Access_Conversions(SIU_Type);
SIU : constant SIU_Conv.Object_Pointer := SIU_Conv.To_Pointer(SIU_Address);
Run Code Online (Sandbox Code Playgroud)
在我们的项目中,我们在许多需要地址分配的地方使用变量,但第二种方式非常简单,并且使代码非常复杂.
如果有的话,Plaese建议任何其他方式.
我正在尝试用float变量的内存地址填充byte/char数组(数组长度是4个字节=指针),但无论我做什么它都会保持浮点值而不是地址:
float f = 20.0f;
memcpy(data, &f, sizeof(data));
Run Code Online (Sandbox Code Playgroud)
调试它:
printf("Array: %#X, %#X, %#X, %#X", data[0], data[1], data[2], data[3]);
Run Code Online (Sandbox Code Playgroud)
...以十六进制格式给出浮点值(20.0):
Array: 0, 0, 0XA0, 0X41
Run Code Online (Sandbox Code Playgroud)
我需要的是float的内存地址.我尝试以某种不同的方式进行铸造/解除引用,但无法使其工作......
我的代码中发生了一个重大问题,我现在一直试图修复几个小时.
下面的代码是与我所遇到的问题相关的代码......
方法addBucket:
void addBucket(SPACE * hashmap,char * tempvalue, char * tempkey){
printf("BEGINNING OF FUNC...\n");
void *prevadd = hashmap[0];
char *value = varString(tempvalue);
char *key = varString(tempkey);
void *aftadd = hashmap[0];
printf("BUCKET %s - %s\n",value,key);
BUCKET *newBucket = malloc(sizeof(BUCKET *));
fillBucket(value,key,newBucket);
int hash = hashFunc(key);
printf("FILL, FULFILLED\n");
if(!hashmap[hash]){
hashmap[hash] = malloc(sizeof(BASE*));
hashmap[hash]->first = NULL;
}
ITEM *location;
location = hashmap[hash]->first;
//This creates a new item in the list, if there isn't any.
//It does this by initialising the base, called …Run Code Online (Sandbox Code Playgroud)