c - In this below C code related to pointers and its output, then why doesn't the value a[1] i.e 20 get stored at consecutive address de9?
问题描述
In the Below code , each location can hold 32 bit signed data. So, why doesn't the value a1 i.e 20 get stored at consecutive address de9? Array should store the data at consecutive memory location right? I know that the sizeof(int) in this online gdb compiler is 4 bytes but how can it be related to the storing of 20 at 4 locations away? Am I missing some basic concepts?
int main()
{
int a[2]= {214748368,20};
void *ptr1 = &a;
void *ptr2= &a;
ptr1++;
ptr2 = ptr2;
printf("%d \n", *(int*)ptr2);
printf("\n Pointer table");
printf("\n Data : %d at address : %p", *(int*)ptr2, ptr2);
ptr2=ptr2+1;
printf("\n Data : %d at address : %p", *(int*)ptr2, ptr2);
ptr2=ptr2+1;
printf("\n Data : %d at address : %p", *(int*)ptr2, ptr2);
ptr2=ptr2+1;
printf("\n Data : %d at address : %p", *(int*)ptr2, ptr2);
ptr2=ptr2+1;
printf("\n Data : %d at address : %p", *(int*)ptr2, ptr2);
return 0;
}
解决方案
当你在 C 中增加一个指针时,会使用指针算法。因此,如果您的指针a
是类型int *
,它将增加sizeof(int)
. 但是,您的指针是 type void *
。这不是有意的,显然它增加了一个字节(参见此处)。
由于int
系统上的 an 大小为 32 位或 4 个字节,因此您必须将指针增加 4 次一个字节才能到达数组中的下一个元素。
您可以通过将指针定义为int *
:
int *ptr1 = &a;
int *ptr2 = &a;
在这种情况下,将指针递增一次 ( ptr2++
) 将为您提供下一个元素。
推荐阅读
- swift - 如何使用 Firebase Analytics 了解“应用的使用时间”
- android - 在发布模式下构建 VisualStudio Cordova 应用程序时出错
- html - 使用 css 将 li 的项目符号更改为图标
- sql-server - 获取表列名称和值的列表
- spring - 带有 Angular 的 Spring-Boot 2
- nlp - ELMO 嵌入开始会话
- ansible - Ansible 包含的播放任务出现错误“无法打开 SFTP 连接”
- dialogflow-es - 如何在 Dialogflow V2 中发送 json 数组
- ios - 无法在 iOS 的 UIWebView 中加载从服务器下载的资源?
- function - 在函数中,如何在不使用 ref 游标的情况下返回多个值?