Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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 但是sizeof()操作符没有';不适用于指针,但适用于数组名称。为什么会这样?_C_Pointers - Fatal编程技术网

C 但是sizeof()操作符没有';不适用于指针,但适用于数组名称。为什么会这样?

C 但是sizeof()操作符没有';不适用于指针,但适用于数组名称。为什么会这样?,c,pointers,C,Pointers,您好,我正在做这个练习,希望在将指向数组的指针传递给函数后获得数组的大小: 但是sizeof()运算符对指针不起作用,但对数组名起作用。为什么会这样? 这是我在findPut函数上获取数组大小的任何方法吗 #include <stdio.h> //global vars int i,j; //functions prototypes void findPut(int *, int); int main(void){ int ins=4; int arr[10]={

您好,我正在做这个练习,希望在将指向数组的指针传递给函数后获得数组的大小:

但是sizeof()运算符对指针不起作用,但对数组名起作用。为什么会这样? 这是我在findPut函数上获取数组大小的任何方法吗

#include <stdio.h>

//global vars
int i,j;
//functions prototypes
void findPut(int *, int);

int main(void){
    int ins=4;
    int arr[10]={1,2,3,5,6,7,8};
    printf("%d\n",sizeof(arr));     //gives 40
    int *ap=arr;
    printf("%d\n",sizeof(*ap));     //gives 4 instead of 40 why?? if ap and arr the same thing


    findPut(ap, ins);
    return 0;
}

//functions
void findPut(int *p, int n){
    //vars
    //getting size of array
    int size= sizeof(*p);   
    //sizeof(int);
    printf("%d\n",size);        //gives 4 but expected 40????

}
#包括
//全局变量
int i,j;
//功能原型
无效findPut(int*,int);
内部主(空){
int-ins=4;
int-arr[10]={1,2,3,5,6,7,8};
printf(“%d\n”,sizeof(arr));//给出40
int*ap=arr;
printf(“%d\n”,sizeof(*ap));//如果ap和arr是同一事物,则给出4而不是40为什么
findPut(ap、ins);
返回0;
}
//功能
无效findPut(int*p,int n){
//瓦尔斯
//获取数组的大小
int size=sizeof(*p);
//sizeof(int);
printf(“%d\n”,size);//给出4,但预期为40????
}

当你取消引用
*p
时,你得到一个
int
,因此它返回4(这是你平台上
int
的大小)。

当你取消引用
*p
时,你得到一个
int
,因此它返回4(这是你平台上
int
的大小)。

因为,
sizeof(*ap)
表示
sizeof(arr[0])
由于数组的类型为
int
sizeof(int)
因为在系统配置中,
int
的大小为
4
,所以得到的结果为
4

您可以通过打印
*p
的值自己尝试,您将获得
arr[0]
的值

int*p
作为指针,并
int arr[10]

请注意:

  • 数组
    和指针不等价
  • sizeof
    运算符是编译时运算符
  • sizeof(arr)
    ,计算结果为
    10*sizeof(int)
    ,即在您的情况下
    10*4=40
  • 当您解引用p(获取p所指向的值)时,它不会给出整个数组,而是一个数组单位 您的数组是
    int
    ,因此,
    *p
    表示
    arr[0]
    sizeof(arr[0])
    is (对你来说)这是显而易见的
  • 当您使用
    sizeof(p)
    时,它将为您提供计算机中指针的大小。 在我的机器里是8
  • main
    函数的返回类型应始终为
    int
    。它必须重新向操作系统报告程序的退出状态。如果使用
    void
    它可能会返回随机垃圾
  • 该示例演示了以下问题:

    #include<stdio.h>
    #include<stdlib.h>
    int main(){
      int *p=NULL;
      int arr[10]={10,1,2,3,5,6,7,8,9,10};
      p=arr;
      printf("values: arr[0]=%d  *p= %d\n\n",arr[0],*p);
      printf("sizes : sizeof(arr[0])=%lu, sizeof(*p)= %lu sizeof(int)=%lu\n\n",sizeof(arr[0]),sizeof(*p),sizeof(int));
      printf("Sizeof pointer p: %lu \n\n",sizeof(p));
      printf("Sizeof arr: %lu \n\n",sizeof(arr));
    
      printf("Pointing p to the first byte of 100 byte sequence\n\n");
      p=malloc(100);
    
      printf("Though p is pointing 100 byte block, sizeof(p)=%lu",sizeof(p));
      return 0;
    }
    
    因为,
    sizeof(*ap)
    表示
    sizeof(arr[0])
    由于数组的类型为
    int
    sizeof(int)
    因为在系统配置中,
    int
    的大小为
    4
    ,所以得到的结果为
    4

    您可以通过打印
    *p
    的值自己尝试,您将获得
    arr[0]
    的值

    int*p
    作为指针,并
    int arr[10]

    请注意:

  • 数组
    和指针不等价
  • sizeof
    运算符是编译时运算符
  • sizeof(arr)
    ,计算结果为
    10*sizeof(int)
    ,即在您的情况下
    10*4=40
  • 当您解引用p(获取p所指向的值)时,它不会给出整个数组,而是一个数组单位 您的数组是
    int
    ,因此,
    *p
    表示
    arr[0]
    sizeof(arr[0])
    is (对你来说)这是显而易见的
  • 当您使用
    sizeof(p)
    时,它将为您提供计算机中指针的大小。 在我的机器里是8
  • main
    函数的返回类型应始终为
    int
    。它必须重新向操作系统报告程序的退出状态。如果使用
    void
    它可能会返回随机垃圾
  • 该示例演示了以下问题:

    #include<stdio.h>
    #include<stdlib.h>
    int main(){
      int *p=NULL;
      int arr[10]={10,1,2,3,5,6,7,8,9,10};
      p=arr;
      printf("values: arr[0]=%d  *p= %d\n\n",arr[0],*p);
      printf("sizes : sizeof(arr[0])=%lu, sizeof(*p)= %lu sizeof(int)=%lu\n\n",sizeof(arr[0]),sizeof(*p),sizeof(int));
      printf("Sizeof pointer p: %lu \n\n",sizeof(p));
      printf("Sizeof arr: %lu \n\n",sizeof(arr));
    
      printf("Pointing p to the first byte of 100 byte sequence\n\n");
      p=malloc(100);
    
      printf("Though p is pointing 100 byte block, sizeof(p)=%lu",sizeof(p));
      return 0;
    }
    

    您有一个
    int
    数组和一个
    int
    指针:

    int arr[10] = {1,2,3,5,6,7,8};
    int* ap;
    ap = arr;
    
    在C语言中,表达式
    arr
    相当于
    &arr[0]
    。因此,显然,
    *ap
    相当于
    arr[0]
    ,它是一个
    int
    ,对于二进制文件来说,它的大小是4


    您还需要了解,数组和指针不是一回事。您可能已经被数组和指针经常互换使用的事实弄糊涂了,因为指针可以存储数组开头的地址(换句话说,它的第一个元素)并导航连续地址,就好像它已将实际数组传递给它一样。

    您有一个
    int
    数组和一个
    int
    指针:

    int arr[10] = {1,2,3,5,6,7,8};
    int* ap;
    ap = arr;
    
    在C语言中,表达式
    arr
    相当于
    &arr[0]
    。因此,显然,
    *ap
    相当于
    arr[0]
    ,它是一个
    int
    ,对于二进制文件来说,它的大小是4


    您还需要了解,数组和指针不是一回事。数组和指针经常互换使用,这可能会让您感到困惑,因为指针可以存储数组开头的地址(换句话说,它的第一个元素)并在连续地址中导航,就好像它已将实际数组传递给它一样。

    因为数组和指针不一样!你认为苹果和橙子味道一样吗?因为数组和指针不一样!你认为苹果和橙子味道一样吗?
    sizeof(int)
    并不总是4。这个答案需要澄清,否则会引起混淆
    p
    是指向整数的指针,
    *p
    是整数,
    sizeof*p
    是整数的大小,在OPs平台上