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进制数,所以00BAF810
比00BAF800
多了一个10
,意思就是16进一,所以&a + 1
其实是走了16步(这里十进制里的16步哦)。
ptr
的内存地址为00BAF810
,ptr+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;
}