c语言指针加减法

c语言指针加减法

下面代码会输出什么()

int main(int argc, char **argv)
{
    
    
    int a[4] = {
    
    1, 2, 3, 4};
    int *ptr = (int *)(&a + 1);
    printf("%d", *(ptr - 1));
}

选项有1,2,3,4。

解析

答案为4。我们打印一下内存地址

void test7() {
    
    

        int a[4] = {
    
     1, 2, 3, 4 };
        printf("a     = %p\n\n", a);

        int* ptr = (int*)(&a + 1);
        printf("ptr   = %p\n", ptr);
        printf("ptr+1 = %p\n", ptr+1);
        printf("ptr+2 = %p\n\n", ptr+2);

        printf("*(ptr - 1) = %d\n", *(ptr - 1));
        printf("*(ptr - 2) = %d\n", *(ptr - 2));
}

输出

a     = 00BAF800

ptr   = 00BAF810
ptr+1 = 00BAF814
ptr+2 = 00BAF818

*(ptr - 1) = 4
*(ptr - 2) = 3

这里的00BAF800为16进制数,所以00BAF81000BAF800多了一个10,意思就是16进一,所以&a + 1其实是走了16步(这里十进制里的16步哦)。
ptr的内存地址为00BAF810ptr+1的内存地址为00BAF814,走了4步(这里十进制里的4步哦)。为什么走了四步?因为int类型为4字节。

参考-整数类型

下表列出了关于标准整数类型的存储大小和值范围的细节:

类型 存储大小 值范围
char 1 字节 -128 到 127 或 0 到 255
unsigned char 1 字节 0 到 255
signed char 1 字节 -128 到 127
int 2 或 4 字节 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
unsigned int 2 或 4 字节 0 到 65,535 或 0 到 4,294,967,295
short 2 字节 -32,768 到 32,767
unsigned short 2 字节 0 到 65,535
long 4 字节 -2,147,483,648 到 2,147,483,647
unsigned long 4 字节 0 到 4,294,967,295

注意,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。

以下列出了32位系统与64位系统的存储大小的差别(windows 相同):
在这里插入图片描述
可以看到int类型为4字节。
为了得到某个类型或某个变量在特定平台上的准确大小,您可以使用 sizeof 运算符。表达式 sizeof(type) 得到对象或类型的存储字节大小。下面的实例演示了获取 int 类型的大小:

#include <stdio.h>
#include <limits.h>
 
int main()
{
    
    
   printf("int 存储大小 : %lu \n", sizeof(int));
   
   return 0;
}

参考-资料

C 数据类型
C语言指针变量的运算(加法、减法和比较运算)

猜你喜欢

转载自blog.csdn.net/e891377/article/details/127718844