【问题标题】:What is difference in int* p and (int*) p in CC中的 int* p 和 (int*) p 有什么区别
【发布时间】:2021-01-05 01:05:40
【问题描述】:

我无法理解在以下程序中使用 (int*) p 来获取指向数组的指针

#include<stdio.h>    
void main()     
{    
 int s[4][2];    
 int (*p)[2];    
 int i,j,*pint;    
    
 for(i=0;i<=3;i++)     
 {    
  p=&s[i];    
  pint=(int*)p; /*here*/    
  printf("\n");    
  for(j=0;j<=1;j++)    
  printf("%d",*(pint+j));    
 }    
}    

我可以在这里使用*p 而不是(int*) p。提前致谢

【问题讨论】:

  • @hacks 这主要是一个错字。
  • @SouravGhosh 我建议回滚编辑并让 OP 解释他/她真正打算做什么。
  • @hacks 为什么? OP 在最后一行提到了这个问题,这对我来说似乎很清楚。

标签: arrays c pointers casting incompatibility


【解决方案1】:

在您的代码中,

 pint=(int*)p;

pint (*)[2] 类型,即指向2 个ints 的数组的指针,而pintint *。它们不是兼容的类型,因此您需要强制转换。

【讨论】:

  • 但即使我不投射和使用 pint=*p 它也会给出相同的输出结果
  • @UV0 在这种情况下,使用*p 可以有效地做同样的事情。它取消引用指针,导致int [2] 值在分配给pint 时衰减为int *。请注意,在这种情况下,取消引用实际上并不执行内存引用。它只是改变了类型。第二次取消引用导致执行内存引用。
【解决方案2】:

如果你有这样的数组声明

int s[4][2];

那么这三个指针的值相同

int ( *p1 )[4][2] = &s;
int ( *p2 )[2] = &s[0];
int *p3 = &s[0][0]; 

因为所有指针都指向为数组分配的内存范围的初始地址。

但是指针有不同的类型,因为它们指向不同类型的对象。

第一个指针作为单个对象指向整个数组。 第二个指针指向一个数组元素,该元素又具有数组类型int[2]。 第三个数组指向int 类型的标量对象。

因此,您不能直接将一个指针分配给另一个指针,因为它们不兼容,尽管正如前面提到的,它们具有相同的值(地址)。

您需要将一种指针类型显式转换为另一种指针类型。

原程序中的这个赋值

p=&s[i];

将每个元素的地址(int[2] 类型的数组)分配给指针。事实上,数组的第一个元素的地址等于&amp;s[i][0]。但是第一个表达式和最后一个表达式的指针类型不同。

所以你需要在这个作业中使用强制转换

pint=(int*)p;

现在在这个表达式中使用指针算法

*(pint+j)

可以遍历指针p最初指向的数组的所有标量元素。

注意main的这个声明

void main() 

是不是一个标准的声明。

你应该像这样声明函数 main

int main( void )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-06
    • 2021-12-30
    • 2016-01-23
    • 2019-08-14
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    相关资源
    最近更新 更多