首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

sizeof(某些指针)总是等于4吗?

在32位系统上,sizeof(某些指针)通常等于4字节,而在64位系统上,它通常等于8字节。这是因为指针需要存储内存地址,在32位系统中,内存地址的范围较小,只需要4字节来表示,而在64位系统中,内存地址的范围更大,需要8字节来表示。

在C++中,可以使用sizeof()运算符来获取指针的大小。例如:

代码语言:cpp
复制
#include<iostream>

int main() {
    int* p = nullptr;
    std::cout << "Size of pointer: "<< sizeof(p)<< std::endl;
    return 0;
}

输出结果将根据编译器的设置和目标平台而有所不同。如果编译器设置为32位,则输出结果为4,如果编译器设置为64位,则输出结果为8。

需要注意的是,即使在32位系统上,指针的大小也可能不是4字节。这取决于编译器和目标平台的实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

指针进阶(4)看一下这些与指针有关的题你都会做

今天我们更新了指针相关常见题型内容, 欢迎大家关注点赞收藏⭐️留言 一、例子1 #include int main() { int a[5] = { 1, 2, 3, 4,...&arr 表示的是 整个数组 的 地址 2.sizeof(arr)中的arr表示的 是整个 数组 (此外的都表示首元素地址,或首行地址等等) 然后我们继续说这个题,此时跳过整个数组之后,&a+1...- &a[4][2], &p[4][2] - &a[4][2]); return 0; } 在x86平台上,你认为这串代码会输出什么呢, 先来分析一下这串代码, int(*p)[4],创建一个数组指针...,然后p指向的是四个整形元素的 然后把a赋给p, 然后我们看输出的元素是指针-指针类型的,指针-指针得到的是指针之间的元素个数的绝对值。...pa,存放char*类型的数组a的地址,a代表数组的首元素,然后pa++,所以pa就等于at 七、例子7 #include int main() { char *c[] = {"ENTER

9510

你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题

[i]); }   其中sizeof(nums)代表计算nums数组的总字节数,而sizeof(int)则代表计算int类型所占用的字节数(32位系统下是4个字节,64位下可能不同,因此这里使用...(nums)在这里是计算指针的字节数 int length = sizeof(nums)/sizeof(int); printf("The length of nums is %d\n"...我们发现,虽然我们使用了指针,但由于sizeof是编译器在编译的时候计算的,无法动态计算。因此对于int *或者将数组传递给函数,那么就无法使用sizeof获取大小了。...这里,sizeof(nums)只是计算了指针的字节数(这里指针指向了数组的首元素的地址,一个int占4个字节,所以最后length变成了1)。   ...const int INT_SIZE = 4; int[] arr = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 }; Buffer.BlockCopy(arr, 3 *

1.5K20
  • sizeof 操作符详解

    一般的,在32位编译环境中,sizeof(int)的取值为4。 5. 指针变量的sizeof 学过数据结构的你应该知道指针是一个很重要的概念,它记录了另一个对象的地址。...既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值必定是4(注意结果是以字节为单位)。...pf ); // 结果为4 ********************************************************* 指针变量的sizeof值与指针所指的对象没有任何关系...这里函数参数a3已不再是数组类型,而是蜕变成指针。相当于char* a3,为什么仔细想想就不难明白。 我们调用函数foo1时,程序会在栈上分配一个大小为3的数组?不会!...为什么受伤的总是我? 请不要沮丧,我们来好好琢磨一下sizeof的定义 —— sizeof的结果等于对象或者类型所占的内存字节数。

    76230

    CC++刁钻问题各个击破之细说sizeof

    而只传递数组的地址(即指针)那么只需要拷贝4byte。 特性4sizeof不能求得动态分配的内存的大小!...假如有如下语句:int*a = new int[10];int n = sizeof(a);那么n的值是多少呢?是40?答案是否定的!...其实n等于4,因为a是指针,在特性2中讲过:在32位平台下,所有指针的大小都是4byte!切记,这里的a与特性3中的a并不一样!...最开始,我以为能输出答案4,因为我认为fun是函数名,而我知道函数名就是函数的地址,地址就是指针,于是我认为sizeof(fun)其实就是对一个指针求大小,根据特性2,任何指针的大小都是4。...这在某些存储空间有限的设备(比如嵌入式设备)上是不合适的,为此需要提供一种能对变量的存储空间精打细算的机制,这就是位域。

    88120

    sizeof,终极无惑(上)

    一般的,在32位编译环境中,sizeof(int)的取值为4。 5. 指针变量的sizeof 学过数据结构的你应该知道指针是一个非常重要的概念,它记录了还有一个对象的地址。...所以在32位计算机中,一个指针变量的返回值必然是4(注意结果是以字节为单位),能够估计,在将来的64位系统中指针变量的sizeof结果为8。...sizeof( pf ); // 结果为4 指针变量的sizeof值与指针所指的对象没有不论什么关系,正是因为全部的指针变量所占内存大小相等,所以MFC消息处理函数使用两个參数WPARAM、LPARAM...细致想想就不难明确,我们调用函数foo1时,程序会在栈上分配一个大小为3的数组?不会!数组是“传址”的,调用者仅仅需将实參的地址传递过去,所以a3自然为指针类型(char*),c3的值也就为4。...为什么受伤的总是我?

    37110

    C++里引用和指针到底有什么区别?

    我们在写代码的时候总是离不开函数,我们调用一个函数,得到一个想要的结果。这个过程好像自然而然,但有的时候又会遇到一些意想不到的问题让我们困扰。...main() { int a = 3; test(&a); printf("%d\n", a); return 0; } 请问test函数执行之后,输出的结果还是3?...难道不都是等于3? 答案是完全不同,后面一种写法a和b虽然都等于3,但是它们的内存是分开的,而前面一种写法则相反,内存也是共享的。 理解了指针和引用是两个概念之后,很多问题也就解开了。...比如sizeof操作,我们来看一个例子: string a = "hello world"; string *b = &a; string &c = a; printf("%d\n", sizeof c...); printf("%d\n", sizeof b); 输出的结果一个是24一个是8,原因很简单,因为sizeof输出的是变量占用的内存大小。

    26820

    C++学习笔记---------基础知识sizeof用法

    错了,sizeof不是一个函数,你见过给一个函数传参数,而不加括号的sizeof可以,所以sizeof不是函数。...既然是指针,所以sizeof(a)就是4。   ...( pi ); // 结果为4 sizeof( ps ); // 结果为4 sizeof( ppc ); // 结果为4 sizeof( pf );// 结果为4 指针变量的sizeof值与指针所指的对象没有任何关系...这里函数参数a3已不再是数组类型,而是蜕变成指针,相当于char* a3,为什么仔细想想就不难明白,我们调用函数foo1时,程序会在栈上分配一个大小为3的数组不会!...Why为什么受伤的总是我 请不要沮丧,我们来好好琢磨一下sizeof的定义——sizeof的结果等于对象或者类型所占的内存字节数,好吧,那就让我们来看看S1的内存分配情况: S1 s1 = { 'a',

    55810

    深入探究C语言中的常量指针与野指针概念及其应用

    ;//等于 &arr[0]; int sz = sizeof(arr) / sizeof(arr[0]); while (p < arr + sz) { printf("%d ", *p);...为了避免野指针的产生和影响,应当总是在声明指针时对其进行初始化,并在释放指针指向的内存后立即将指针置为NULL,同时确保指针在其有效作用域内使用。...内存泄漏:在某些情况下,野指针可能导致内存泄漏。例如,如果一个野指针指向了一块已经分配但未被释放的内存,而这块内存又在其他地方被重复分配,就会造成内存泄漏。 4....谨慎解引用:在使用指针前,应当确保它指向的是一个有效的内存地址,避免对无效地址进行解引用操作。 4....:当你想保护某些数据不被修改时,可以使用常量指针

    18910

    茫茫人海,如何快速找到合适的 ta?

    示例 2: 输入:nums = [3,2,4], target = 6 输出:[1,2] 示例 3: 输入:nums = [3,3], target = 6 输出:[0,1] 提示: 2 <=...(n^2) 的算法?...解题思路 在数组「不一定有序」中查找两个元素,使得「其和等于目标值」,求这两个元素的下标。最容易想到的方法是「暴力法」,只需要「枚举」数组中所有的不同的两个元素组合,判断其和是否等于目标值即可。...排序完成之后,初始化两个指针,其中首指针指向数组第一个元素,尾指针指向数组的最后一个元素,然后判断其指向的「元素之和是否等于目标值」,如果等于,则直接返回两下标,否则「移动首尾指针」(小于目标值,右移首指针...Show me the Code 「C」 int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; } /* 对撞指针获取数组中元素之和等于

    39730

    【读书笔记】读《程序员面试宝典》

    4)数组做sizeof的参数不退化,传递给strlen就退化为指针。     (5)大部分编译程序在编译的时候,就把sizeof计算过了,是类型或者变量长度。...2.指针与引用     (1)指针与引用的差别?      答:(1)非空引用。在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。...因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量生命为指针,因为这样你可以赋空值给该变量。...相反,指针则应该总是被测试,防止其为空。        (3)可修改区别。指针和引用的另一个重要的区别是指针可以被重新赋值以指向另一个不同的对象。...但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指向的对象其内容可以改变。        (4)应用区别。

    83420

    查找表的经典题

    示例 2: 输入:nums = [3,2,4], target = 6 输出:[1,2] 示例 3: 输入:nums = [3,3], target = 6 输出:[0,1] 提示: 2 <=...nums.length <= 10^4 -10^9 <= nums[i] <= 10^9 -10^9 <= target <= 10^9 只会存在一个有效答案 进阶:你可以想出一个时间复杂度小于 O...(n^2) 的算法?...排序完成之后,初始化两个指针,其中首指针指向数组第一个元素,尾指针指向数组的最后一个元素,然后判断其指向的「元素之和是否等于目标值」,如果等于,则直接返回两下标,否则「移动首尾指针」(小于目标值,右移首指针...Show me the Code 「C」 int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; } /* 对撞指针获取数组中元素之和等于

    59810

    常见的C编程段错误及对策

    这里定义了结构体变量stu,但是他没想到这个结构体内部char *name 这成员在定义结构体变量stu 时,只是给name 这个指针变量本身分配了4 个字节。...这里把sizeof(struct student)误写为sizeof(struct student*)。当然name 指针同样没有被分配内存。解决办法同上。...因为系统会按照这个结构体中的某些特定成员的值去字库中寻找匹配的字体,当这些值与字库中某种字体的某些项匹配时,就调用这种字体。但是很不幸,正是因为这几个乱码,导致没有找到相匹配的字体!...= p)这样的校验语句还能起作用?...所以一定要记住一条:free 完之后,一定要给指针置NULL。 同时留一个问题:对NULL 指针连续free 多次会出错?为什么?如果让你来设计free函数,你会怎么处理这个问题?

    1.5K41

    菜鸟刷题Day6

    5→NULL m=2,n=4, 返回 1→4→3→2→5→NULL ---- 解题思路 如果只有一个节点或者m==n,那就直接返回head,因为不用反转。...核心就是只要前面的数值相加结果等于零,那么前面所有的节点都可以舍弃。...,后续只动tail指针,最后用head做返回值。...return ans; } 其实就是拥有左括号数的最大值 最近铃芽之旅上线了不知道各位有没有去看(又有多少老铁是一个人去看的,斜眼笑),昨天我可是特意给你们放了假(好吧,其实是昨天课太多了,而我又被某些题目卡了三个小时所以才没来得及...人们总是高估短期努力能够带来的提升,却忽略长期坚持能带来的改变。今天是第六天了,你还有坚持

    25200

    结构体学不明白,小代老师带你深入理解结构体

    //在上⾯代码的基础上,下⾯的代码合法? p = &x; 警告: 编译器会把上⾯的两个声明当成完全不同的两个类型,所以是⾮法的。...⽐如,定义⼀个链表的节点: struct Node { int data; struct Node next; }; 上述代码正确?...,也容易引⼊问题,看看 下⾯的代码,可⾏?...⼤部分的参考资料都是这样说的: 平台原因 (移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定 类型的数据,否则抛出硬件异常。...假设⼀个处理器总是从内存中取8个字节,则地 址必须是8的倍数。如果我们能保证将所有的double类型的数据的地址都对⻬成8的倍数,那么就可以 ⽤⼀个内存操作来读或者写值了。

    10110

    一篇文章完全讲解C语言指针

    sizeof关键字 sizeof关键字是编译器用来计算某些类型的数据的长度的,以字节为基本单位。..., sizeof(int *),sizeof(xxx *),不要理会,统统写4,只要是指针,长度就是4个字节,绝对不要被type类型迷惑!...注意看注释部分的结果,我们看到,piv的值显示加了4sizeof(int)),然后又加了16(4*sizeof(int))。 指针变量和指向关系 用来保存指针的变量,就是指针变量。...在C语言中,我们让指针变量赋值为NULL表示一个空指针,而C语言中,NULL实质是((void*)0),就像前面说的指针可以理解成特殊的int,它总是有值的,p=NULL,其实就是p的值等于0。...,这在某些场合非常有用,因此有些操作对于任意指针都是相同的。

    1K20

    掌握C语言结构体,开启编程新世界

    你以为9就是struct S1的字节,那你就错了,我们还得对齐最大对齐数(4)。所以最后的结果就是12个字节。这样虽然会浪费空间,但是也是有一定的好处,我们之后再说。...平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定 类型的数据,否则抛出硬件异常。 2....假设⼀个处理器总是从内存中取8个字节,则地 址必须是8的倍数。如果我们能保证将所有的double类型的数据的地址都对⻬成8的倍数,那么就可以 ⽤⼀个内存操作来读或者写值了。...因此,位字段的大小可能不等于字段成员所占的位数之和。开发者需要了解编译器对位字段进行内存对齐的规则,以确保结构体的大小和内存布局符合预期。...位字段的类型:位字段的类型可以是整型或枚举类型,但不能是浮点型、指针类型等。这是因为浮点型和指针类型的大小是可变的,无法确定应该占多少个位。

    12510
    领券