相关疑难解决方法(0)

空引用是否可行?

这段代码是否有效(和定义的行为)?

int &nullReference = *(int*)0;
Run Code Online (Sandbox Code Playgroud)

这两个g ++以及铛++编译它没有任何警告,即使使用-Wall,-Wextra,-std=c++98,-pedantic,-Weffc++...

当然,引用实际上不是null,因为它无法访问(这意味着取消引用空指针),但我们可以通过检查其地址来检查它是否为null:

if( & nullReference == 0 ) // null reference
Run Code Online (Sandbox Code Playgroud)

c++ null reference language-lawyer

91
推荐指数
4
解决办法
10万
查看次数

将C++指针视为内存地址的可接受程度如何?

当你学习C++时,或者至少当我通过C++ Primer学习它时,指针被称为它们指向的元素的"内存地址".我想知道这是多少.

例如,做两个元素*p1*p2拥有属性,p2 = p1 + 1或者p1 = p2 + 1 当且仅当它们在物理内存中相邻时?

c++ hardware pointers

41
推荐指数
5
解决办法
2226
查看次数

C中的指针实现细节

我想知道违反我在下面列出的假设的架构.此外,我想知道所有架构的假设是否都是错误的(也就是说,如果它们中的任何一个完全错误的话).

  1. sizeof(int*)== sizeof(char*)== sizeof(void*)== sizeof(func_ptr*)

  2. 无论指向哪种数据类型,给定体系结构的所有指针的内存中表示都是相同的.

  3. 指针的内存中表示与与体系结构相同的位长的整数相同.

  4. 指针数据类型的乘法和除法仅被编译器禁止.注意:是的,我知道这是荒谬的.我的意思是 - 是否有硬件支持禁止这种不正确的用法?

  5. 所有指针值都可以转换为单个整数.换句话说,哪些架构仍然使用分段和偏移?

  6. 递增指针相当于添加sizeof(the pointed data type)指针存储的内存地址.如果pint32*p+1则等于4字节后的内存地址p.

我最习惯在连续的虚拟内存空间中使用指针.对于这种用法,我通常可以将它们视为数字线上的地址.请参阅堆栈溢出问题指针比较.

c pointers sizeof virtual-memory

16
推荐指数
4
解决办法
5104
查看次数

指针和指针变量之间有什么区别?

我知道这是非常基本的,但对我来说有点混乱.
我读了:

一个指针只不过是一个多地址,并且指针变量只是可变量存储地址.
当我们将变量的地址存储i在指针变量中时p,我们说它p 指向 i.

int i, *p = &i;
Run Code Online (Sandbox Code Playgroud)

p指向i.

为了访问指针指向的对象,我们使用*(间接)运算符.

如果p 是指针*p表示p当前指向的对象.

现在我很困惑,我应该调用什么p- 指针指针变量

附加:指针是否始终与地址相同?

c function-pointers

11
推荐指数
2
解决办法
4万
查看次数

指针究竟存储了什么?(C++)

我知道指针存储了它们指向的值的地址,但是如果直接在屏幕上显示指针的值,则会得到一个十六进制数字.如果数字正是指针存储的数字,那么当说

pA = pB; //both are pointers
Run Code Online (Sandbox Code Playgroud)

你正在复制地址.那么在处理像ints和bools 这样的非常小的项目时,使用指针会不会有更大的开销?

c++ pointers overhead

7
推荐指数
1
解决办法
1932
查看次数

在C++中对动态分配的内存进行碎片整理

动态分配的内存(使用new和malloc运算符分配)的碎片整理如何在C++中工作?

c++ memory-management

5
推荐指数
1
解决办法
6307
查看次数

为什么我们需要把*用于指针

当我突然想到指针只是一个存储变量的内存地址的变量时,我正在读指针,所以每个整数都应该作为指针.然后我创建了一个小程序,它发出警告,但它以某种方式工作.

int main()
{
    int i,j;
    i=3;
    j=&i;
    printf("%d\n%d\n%d",i,j,&i);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是

3
1606416600
1606416600
Run Code Online (Sandbox Code Playgroud)

那么,为什么要添加额外的*如果正常的int工作呢?

另一个问题是关于以下计划的输出

int main()
{
    int a[] = {1,2,3,4,5,6,7};
    int *i,*j;
    i=&a[1];
    j=&a[5];
    printf("%d\n%d\n%d",j,i,j-i);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

1606416580
1606416564
4
Run Code Online (Sandbox Code Playgroud)

为什么ji = 4而不是16?

c c++ pointers

5
推荐指数
2
解决办法
538
查看次数

指针只存储内存地址吗?

这些天我正在学习C编程语言.我有一个关于指针的问题.

教科书说指针存储内存地址,使用printf("%p",pointer)我们可以显示这个指针在我们的内存中指向的位置.

但每个指针都有一个类型,如int *pointer,long *p等等.int *pointer表示"p是指向int的指针".

我的问题,如果我们写

int *p,i;
p=&i;
*p=99;
Run Code Online (Sandbox Code Playgroud)

如果指针只包含地址信息,程序怎么知道应该用多少位数来存储整数99?因为整数可以是16位int或32位long.

所以我想知道内存中的int指针是否不仅存储地址信息,还存储类型信息?

c

4
推荐指数
1
解决办法
1575
查看次数

哪个位是整数的地址?

这很简单.比方说我有:

char x = -1;
Run Code Online (Sandbox Code Playgroud)

然后在记忆中,我(很可能?)

 11111111
(01234567)
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,如果我写的&x是地址,我会回到第0位或第7位的地址,这是最重要还是最不重要的位?

在32位整数的情况下怎么样?

c memory pointers

2
推荐指数
1
解决办法
733
查看次数

如何比较两个空的地址*

我有两个void *,即void *avoid *b.让我们说a是在0x804ae0b现在0x804aec.我该如何比较两者?我想检查地址a是否低于地址b.

c pointers

-1
推荐指数
1
解决办法
1061
查看次数