C “与”的区别是什么;无符号整数*ptr";并签署int*ptr";?

C “与”的区别是什么;无符号整数*ptr";并签署int*ptr";?,c,linux,C,Linux,我知道整数指针将解引用4个字节,那么有符号和无符号指针会做什么呢? “unsigned int*ptr”和“signed int*ptr”的含义是什么?指针类型表明它可以保留哪种类型的变量地址。因此,unsigned int*ptr应该保留unsigned int的地址,signed int*ptr应该保留signed int 请看下面的代码 int main() { unsigned int * ptr1; signed int * ptr2; unsigne

我知道整数指针将解引用4个字节,那么有符号和无符号指针会做什么呢?
“unsigned int*ptr”和“signed int*ptr”的含义是什么?

指针类型表明它可以保留哪种类型的变量地址。因此,
unsigned int*ptr
应该保留
unsigned int
的地址,
signed int*ptr
应该保留
signed int

请看下面的代码

  int main()
  {
    unsigned int * ptr1;
    signed int * ptr2;

    unsigned int i;
    signed int s;

    ptr1 = &s;
    ptr2 = &i;
      
  }
它在VisualStudio中给了我以下错误

错误1错误C2440:“=”:无法从“int*”转换为“unsigned int*”[…]

错误2错误C2440:“=”:无法从“unsigned int*”转换为“int*”[…]


指针的类型表明它可以保留什么类型的变量地址。因此,
unsigned int*ptr
应该保留
unsigned int
的地址,
signed int*ptr
应该保留
signed int

请看下面的代码

  int main()
  {
    unsigned int * ptr1;
    signed int * ptr2;

    unsigned int i;
    signed int s;

    ptr1 = &s;
    ptr2 = &i;
      
  }
它在VisualStudio中给了我以下错误

错误1错误C2440:“=”:无法从“int*”转换为“unsigned int*”[…]

错误2错误C2440:“=”:无法从“unsigned int*”转换为“int*”[…]


在C/C++中,指针只不过是一个内存位置;对于给定的体系结构,它们的大小是相同的。指针的类型,如void*、int*、unsigned int*等。。。告诉编译器如何处理指针数学

以这种方式想象它总是有助于我

char *ptrMyString = "test";
int *ptrMyINTS[] = {1,2,3,4}
上面每个阵列的内存如下所示:

Offsets        0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15 
ptrMyString = [t] [e] [s] [t] [0]
ptrMyINTS   = [0] [0] [0] [1] [0] [0] [0] [2] [0] [0] [0] [3] [0] [0] [0] [4]
sizeof(ptrmysting)应该等于sizeof(ptrMyINTS),因为它们只是内存指针。但是,ptrmysting++将增加1,其中ptrMYINTS将增加4

现在我过度简化了很多东西,忽略了虚拟内存之类的东西,但基本思想是,例如,如果两个指针都从0x00000000(32位地址)开始,那么每个偏移量的指针值将是:

ptrMyString+0 = 0x00000000 = t
ptrMyString+1 = 0x00000001 = e
ptrMyString+2 = 0x00000002 = s
ptrMyString+3 = 0x00000003 = t

ptrMyINTS+0 = 0x00000000 = 1
ptrMyINTS+1 = 0x00000004 = 2
ptrMyINTS+2 = 0x00000008 = 3
ptrMyINTS+3 = 0x0000000C = 4

请注意,所有位置的大小都是相同的,但我们增加的量1和4分别来自指针的类型char*和int*。我假设int在这里是4字节,因为它在32位X86和ARM体系结构上。

在C/C++中,指针只不过是一个内存位置;对于给定的体系结构,它们的大小是相同的。指针的类型,如void*、int*、unsigned int*等。。。告诉编译器如何处理指针数学

以这种方式想象它总是有助于我

char *ptrMyString = "test";
int *ptrMyINTS[] = {1,2,3,4}
上面每个阵列的内存如下所示:

Offsets        0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15 
ptrMyString = [t] [e] [s] [t] [0]
ptrMyINTS   = [0] [0] [0] [1] [0] [0] [0] [2] [0] [0] [0] [3] [0] [0] [0] [4]
sizeof(ptrmysting)应该等于sizeof(ptrMyINTS),因为它们只是内存指针。但是,ptrmysting++将增加1,其中ptrMYINTS将增加4

现在我过度简化了很多东西,忽略了虚拟内存之类的东西,但基本思想是,例如,如果两个指针都从0x00000000(32位地址)开始,那么每个偏移量的指针值将是:

ptrMyString+0 = 0x00000000 = t
ptrMyString+1 = 0x00000001 = e
ptrMyString+2 = 0x00000002 = s
ptrMyString+3 = 0x00000003 = t

ptrMyINTS+0 = 0x00000000 = 1
ptrMyINTS+1 = 0x00000004 = 2
ptrMyINTS+2 = 0x00000008 = 3
ptrMyINTS+3 = 0x0000000C = 4
请注意,所有位置的大小都是相同的,但我们增加的量1和4分别来自指针的类型char*和int*。我假设int在这里是4字节,因为它在32位X86和ARM体系结构上

unsigned int* ptr;
signed int* ptr;
假定
ptr
的值包含
无符号int
。同样,当你有

unsigned int* ptr;
signed int* ptr;
假定
ptr
的值包含有符号的int

下面是一个简单的实验:

#include <stdio.h>

int main()
{
   signed int i = -10;
   signed int* p1 = &i;
   unsigned int* p2 = (unsigned int*)p1;

   printf("Value of p1: 0x%p\n", p1);
   printf("Value of p2: 0x%p\n", p2);

   printf("Value of *p1: %d\n", *p1);
   printf("Value of *p2: %u\n", *p2);
}
#包括
int main()
{
有符号整数i=-10;
有符号整数*p1=&i;
无符号整数*p2=(无符号整数*)p1;
printf(“p1的值:0x%p\n”,p1);
printf(“p2的值:0x%p\n”,p2);
printf(“*p1的值:%d\n”,*p1);
printf(“*p2的值:%u\n”,*p2);
}
该程序的示例输出:

Value of p1: 0x0x7fff1b52bd6c Value of p2: 0x0x7fff1b52bd6c Value of *p1: -10 Value of *p2: 4294967286 p1的值:0x0x7fff1b52bd6c p2的值:0x0x7fff1b52bd6c *p1的值:-10 *p2的值:4294967286 即使
p1
p2
所持有的地址的数值相同,当取消引用时,它们的计算结果也会大不相同。

unsigned int* ptr;
signed int* ptr;
假定
ptr
的值包含
无符号int
。同样,当你有

unsigned int* ptr;
signed int* ptr;
假定
ptr
的值包含有符号的int

下面是一个简单的实验:

#include <stdio.h>

int main()
{
   signed int i = -10;
   signed int* p1 = &i;
   unsigned int* p2 = (unsigned int*)p1;

   printf("Value of p1: 0x%p\n", p1);
   printf("Value of p2: 0x%p\n", p2);

   printf("Value of *p1: %d\n", *p1);
   printf("Value of *p2: %u\n", *p2);
}
#包括
int main()
{
有符号整数i=-10;
有符号整数*p1=&i;
无符号整数*p2=(无符号整数*)p1;
printf(“p1的值:0x%p\n”,p1);
printf(“p2的值:0x%p\n”,p2);
printf(“*p1的值:%d\n”,*p1);
printf(“*p2的值:%u\n”,*p2);
}
该程序的示例输出:

Value of p1: 0x0x7fff1b52bd6c Value of p2: 0x0x7fff1b52bd6c Value of *p1: -10 Value of *p2: 4294967286 p1的值:0x0x7fff1b52bd6c p2的值:0x0x7fff1b52bd6c *p1的值:-10 *p2的值:4294967286
即使
p1
p2
所持有的地址的数值是相同的,但当取消引用时,它们的计算结果却大不相同。

@SeanPedersen OP询问的是指针,而不是有符号的
-ness应用于指针指向的变量,而不是指针本身。“整数指针将取消引用4个字节”并不总是正确的。有些系统取消引用2个(即使在2014年)或8个字节。@SeanPedersen OP询问的是指针,而不是有符号的值
-ness应用于指针指向的变量,而不是指针本身。“整数指针将取消引用4个字节。”“这并不总是真的。有些系统取消引用2(甚至在2014年)或8字节。请帮助我完成此程序;它给出了输出:p1 Val:-10,p2 Val:-10#include main(){int a=-10;unsigned int*p1=&a;int*p2=&a;printf(“p1 Val:%d,p2 Val:%d\n”,*p1,*p2);}
int a
是有符号的int(默认情况下int是有符号的),您正在尝试在
unsigned int*p1
帮助我使用这个程序;它给出了输出:p1 Val:-10,p2 Val:-10#include main(){int a=-10;unsigne