为什么C语言地址输出格式不同,一个短一个长?

一个图是代码,一个图是运行结果。
好奇为什么有长有短,是它们存放的位置不同吗?谁能解释一下。

img

img

第一个是打印a的值,以地址的方式打印,由于a没有给初始值,该值是随机的!
第二个打印的a的地址,即系统分配给a的地址,以地址方式打印!
第三个打a的下一个地址,由于a是四个字节,下一个地址偏移四个字节!

第一个打印的是 a 的值, 第二个是 a 的地址, 第三个是 a 的地址 + 1 个步长,这里是 4字节,c+4 = 0 ,这是个 32 位编译器

第一个输出的是a的值,后2个输出的是地址

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7778348
  • 你也可以参考下这篇文章:【C语言】二分查找。给定一个有序的数列,查找指定的数值。如果查询到该数值,则返回该数值在数组中的位置。
  • 除此之外, 这篇博客: C语言实现顺序查找中的 算法思想:遍历整个数组,依次将数组中的每一个元素与待查找的数据进行比较,若没找到,则停止循环,输出其位置值;如果遍历结束,都没有找到符合条件的数,则输出“没找到”等提示信息。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 核心从数据的第一个元素开始,依次比较,直到找到目标数据或查找失败

                1.从表中的第一个元素开始,依次与关键字比较。

                2.若某个元素匹配关键字,则 查找成功。

                3.若查找到最后一个元素还未匹配关键字,则 查找失败。

     

    顺序查找对表中元素的排序无要求,这些元素在表中可以任意排序,这使得顺序查找的适应性很高。顺序查找的实现很简单,其示例代码如下:

    #include "stdio.h"
    void main(){
    	int a[10],num,i,flag;                 /*变量定义*/
    	printf("Please input numbers: ");
    	for(i=0;i<=9;i++){
    		scanf("%d",&a[i]);                 /*接收输入的数组*/
    	}
    	printf("Please finding numbers: ");
    	scanf("%d", &num);                   /*接收关键字*/
    	for(i=0;i<=9;i++){
    		if(a[i]=num){                      //查找到所需的元素,跳出循环
    			flag=1;
    			break;
    		}
    	}
    	if(i==10){
    		flag=0;
    	}
    	if(flag){
    		printf("The numbers find!\n");
    	}
    	else{
    		printf("The numbers No find!\n");
    	}
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载

  • 您还可以看一下 黄强老师的掌握C语言链表课程中的 为什么需要链表?小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题解答:

    C语言地址输出格式的差异原因是因为在不同的操作系统下或编译器下,存储单元长度可能会不同,有些操作系统下会将指针类型设为4字节,有些会设置为8字节,所以输出格式的长度会有所不同。此外,不同的编译器也可能会有不同的对齐方式以及编译器选项,也会导致地址输出格式的差异。

    要解决这个问题,可以使用类型转换来规范输出的长度,比如使用 %p 或 %lx 格式化输出指针地址,还可以使用 intptr_t 或 uintptr_t 来兼容不同的系统和编译器,并避免数据类型长度不一致的问题。

    示例代码:

    #include <stdio.h>
    #include <stdint.h>
    
    int main() {
        int x = 1;
        int* p = &x;
        printf("p=%p\n", (void*)p); // %p 格式化输出指针地址
        printf("p=%lx\n", (uintptr_t)p); // %lx 格式化输出指针地址的无符号整数值
        return 0;
    }
    

    注意:为了防止指针类型被隐式转换为其它类型,建议在输出指针时先将其转为 void* 类型。