C++ 需要帮助理解指针算法吗

C++ 需要帮助理解指针算法吗,c++,memory,pointers,C++,Memory,Pointers,我在理解指针运算或内存分配方面有困难。在下面的代码片段中,我试图访问“size=1”的值,该值位于“test”之前8个字节,但我没有得到size的值,并且该值不是随机的。所以我可能在理解字节大小方面有问题。如果void*、long和char是8个字节,那么在使用指针算法时是否重要 #include <iostream> using namespace std; char arrayOfCrap[100]; void * what(){ long * size ;

我在理解指针运算或内存分配方面有困难。在下面的代码片段中,我试图访问“size=1”的值,该值位于“test”之前8个字节,但我没有得到size的值,并且该值不是随机的。所以我可能在理解字节大小方面有问题。如果void*、long和char是8个字节,那么在使用指针算法时是否重要

#include <iostream>
using namespace std;

char arrayOfCrap[100];

void * what(){
    long * size ; 
    size = (long*)&arrayOfCrap[28];
    *size = 1;
    return ((void*) &arrayOfCrap[29]);
}

int main(){

    long * test;
    test =  (long*)what();
    *test = 1221;
    cout << "Value of test: " << *test << endl;
    cout << "Long number before test: " << *(test-1) << endl;
}
#包括
使用名称空间std;
char arrayOfCrap[100];
void*what(){
长*尺寸;
大小=(长*)和阵列FCRAP[28];
*尺寸=1;
返回((void*)和arrayOfCrap[29]);
}
int main(){
长*试验;
测试=(长*)什么();
*试验=1221;

cout您的代码没有定位
*大小
*测试
之前的八个字节:

size = (long*)&arrayOfCrap[28];
arrayOfCrap是
char arrayOfCrap[100]
因此
arrayOfCrap[28]
是偏移量28处的字符,
arrayOfCrap[29]
是偏移量29处的字符

test++
起作用的原因是test的类型是
long*
,因此增加它实际上会在很长一段时间内移动到下一个位置,而增加
char*
或在char数组上使用索引会为char提供下一个位置

您还可以执行以下操作之一:

void * what(){
    long * size ; 
    size = (long*)&arrayOfCrap[28];
    *size = 1;
    return size+1;
}

void * what(){
    long * size ; 
    size = (long*)&arrayOfCrap[28];
    *size = 1;
    return ((void*) &arrayOfCrap[28 + sizeof(long)];
}

顺便说一句,将指针仅指向任何内存位置并将其视为指向另一类型的指针并不一定安全。某些平台要求某些类型“对齐”,或者这些类型仅存在于某个值的倍数处。在这些平台上,对未对齐对象的读写可能会崩溃(总线错误)或者具有未定义的行为。此外,某些平台可能不会崩溃或行为不正确,但在读取/写入对齐对象时具有更好的性能。我知道这完全与您的实验无关,但对于真正的代码,您应该知道这一点。下面是一个在真正的代码中不应做的示例:

int read_int(char *&c) {
  int out = *(int*)c; // c may not be properly aligned!
  c += sizeof(int);

  return out;
}

不幸的是,在普通的x86平台上,未对齐的访问通常很慢,而不是总是会导致崩溃,因此该平台的用户必须特别小心。

当您增加指针时,它的增量不是指针大小,而是指针类型的大小。
char*
指针增量为
sizeof(char)
,指针增量为
sizeof(long)

sizeof(char*)
sizeof(long*)
的大小应相同(32位系统上通常为4字节,64位系统上为8字节)

但是,
sizeof(char)
sizeof(long)
是不同的

您将指针大小与整数大小混淆

#include <iostream>
using namespace std;

int main()
{
    cout << "\n sizeof(char*)   " << sizeof(char *);
    cout << "\n sizeof(char)    " << sizeof(char);
    cout << "\n sizeof(long*)   " << sizeof(long *);
    cout << "\n sizeof(long)    " << sizeof(long);
}
#包括
使用名称空间std;
int main()
{

请问输出是什么?您希望输出什么?
char
不是8个字节;它总是1个字节。Jebus我觉得有点迟钝。我以为我做了一个sizeif(char),它给了我8个,但我想错了哈哈。谢谢!哦,我明白为什么我认为char是8个字节了,因为我做了sizeof(char*)
#include <iostream>
using namespace std;

int main()
{
    cout << "\n sizeof(char*)   " << sizeof(char *);
    cout << "\n sizeof(char)    " << sizeof(char);
    cout << "\n sizeof(long*)   " << sizeof(long *);
    cout << "\n sizeof(long)    " << sizeof(long);
}