Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我们可以在int*和unsigned int之间进行运算吗?_C++_Pointers - Fatal编程技术网

C++ 我们可以在int*和unsigned int之间进行运算吗?

C++ 我们可以在int*和unsigned int之间进行运算吗?,c++,pointers,C++,Pointers,如果我申报 int x = 5 ; int* p = &x; unsigned int y = 10 ; cout << p+y ; intx=5; int*p=&x; 无符号整数y=10; cout数学是有效的;结果指针不是 当你说ptr+i(其中ptr是int*)时,它的计算结果是i*sizeof(int)字节数超过ptr。在这种情况下,由于指针指向一个int,而不是一个数组,所以您不知道(C++没有说明)什么是“代码> P+10 < < /P>”。 但是,如果你有

如果我申报

int x = 5 ;
int* p = &x;
unsigned int y = 10 ;
cout << p+y ;
intx=5;
int*p=&x;
无符号整数y=10;

cout数学是有效的;结果指针不是

当你说
ptr+i
(其中
ptr
int*
)时,它的计算结果是
i*sizeof(int)
字节数超过
ptr
。在这种情况下,由于指针指向一个int,而不是一个数组,所以您不知道(C++没有说明)什么是“代码> P+10 < < /P>”。 但是,如果你有

int ii[20] = { 0 };
int *p = ii;
unsigned int y = 10;
cout << p + y;
intii[20]={0};
int*p=ii;
无符号整数y=10;

coutint类型的变量是能够包含整数值的变量。
int*
类型的变量是指向包含整数值的变量copable的指针

每种指针类型都有相同的大小,并且包含相同的内容:内存地址,32位arquitectures的大小为4字节,64位arquitectures的大小为8字节。区别它们的是它们指向的变量的类型

指针对于寻址在运行时动态分配的缓冲区和结构,或者任何类型的变量都很有用,这些变量将被使用,但存储在其他地方,您必须告诉它们在哪里

带指针的算术运算是可能的,但它们不会按您的想法进行。例如,将
+1
求和到
int
类型的指针将使其值增加
sizeof(int)
,而不是字面上的
1
,因为它是一个指针,这里的逻辑是您想要此数组的下一个对象

例如:

int a[] = { 10, 20, 30, 40 };
int *b = a;
printf("%d\n", *b);
b = b + 1;
printf("%d\n", *b);
它将输出:

10
20
因为
b
指向整数值
10
,当您将
1
或任何包含整数的变量相加时,它会指向下一个值
20

如果要使用存储在
b
的变量执行操作,可以使用:

*b = *b + 3;
现在
b
是同一个指针,地址没有改变。但是数组
10,20,30,40
现在包含值
13,20,30,40
,因为您增加了
b
所指向的元素
3

这是C++中的有效方法吗?如果不是,为什么?


对<代码>cout您在代码段中所做的不是将无符号int转换为指针。相反,您将指针递增一个整数偏移量,这是一个非常有效的操作。当访问数组的索引时,基本上是将指针指向第一个元素,并将其增加整数索引值。此操作的结果是另一个指针

如果p是指针/数组,则以下两行是等效的和有效的(假设指向的数组足够大)

若要将无符号int转换为指针,必须使用强制转换

unsigned int i = 5;
char *p = reinterpret_cast<char *>(i);
无符号整数i=5;
char*p=重新解释(i);
然而,这是危险的。你怎么知道5是一个有效地址

指针在内存中表示为无符号整数类型,即地址。可以将指针存储在整数中。但是,必须注意整数数据类型足够大,可以容纳指针中的所有位。如果unsigned int为32位,指针为64位,则某些地址信息将丢失

C++11引入了一种新类型
uintptr\u t
,它保证足够大,可以容纳指针。因此,可以安全地将指针投射到
uintpttr\t
并再次返回

很少(应该永远不要在常规编程中)需要将指针存储为整数


但是,通过整数偏移量修改指针是完全有效且常见的。

整数不是指针。指针不是整数。“指针基本上是无符号整数。”不,不是。指针和整数是完全不同的抽象。底层的表示是不相关的(而按位转换是邪恶的,所以不要去想它)。@aaronman:在Java中指针(我猜你指的是引用)以什么方式更紧密地联系在一起?或者你只是对初学者不必要的粗鲁?@aaronman在这种情况下,至少建议一些理智的建议,比如C#:3唯一的保证是指针在内存中寻址连续数组时的行为类似于整数。除此之外,它们根本不需要是整数——它们可以是任何东西(文件、URL、香蕉等等),它们是底层硬件内存模型的抽象。指向指针算法帮助页面的链接可能也会对操作有益。但是,允许您在指针上添加1。C++有一个指针,它指向指向刚刚结束的内存位置,如果你不引用它。@ DennisMeng,但需要使用标准的算法在数组上,因为<代码>结束<代码>迭代器是过去的最后一个元素。@丹尼斯蒙:不是。一个普通的C++习语传递一组值包括传递起点和刚刚过去的终点。如果通过了
p
p+1
,基本上可以将
x
视为一个包含一个整数的序列,用于该调用。如果您想做一些需要一个值列表的事情,但是您只有一个值,并且没有看到仅仅为了拥有一个数组而创建数组的意义,那么这可能很方便。@DennisMeng行为未定义。如果你认为它有任何特点(如在你脸上爆炸),那么你是在愚弄自己。但这是桥下所有的水,因为你不会去引用指针,是不是…不总是正确的(关于指针的位置)。如果指针未引用边界中的元素或数组末尾的元素,则该指针是未定义的行为
unsigned int i = 5;
char *p = reinterpret_cast<char *>(i);