Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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 使用指针显示数组的内容_C_Pointers - Fatal编程技术网

C 使用指针显示数组的内容

C 使用指针显示数组的内容,c,pointers,C,Pointers,我被困在如何使用指针来显示数组的问题上。我可以很容易地通过使用for循环的数组来实现这一点,但我很想知道如何通过指针来使用,并且我被困在了如何计算数组的起点和终点的问题上 下面是示例程序 void printArray(int *ptr); { //for statement to print values using array for( ptr!=NULL; ptr++) // i know this do

我被困在如何使用指针来显示数组的问题上。我可以很容易地通过使用for循环的数组来实现这一点,但我很想知道如何通过指针来使用,并且我被困在了如何计算数组的起点和终点的问题上

下面是示例程序

 void printArray(int *ptr);            
{         
    //for statement to print values using array             
    for( ptr!=NULL; ptr++) // i know this doesn't work         
    printf("%d", *ptr);        
}         

int main()    
{    
    int array[6] = {2,4,6,8,10};     
    printArray(array);    
    return 0;     
}

您有几个选择:

  • 您可以将数组的大小传递给函数
  • 您可以将一个特殊的“sentinel”值(例如
    -1
    )作为数组的最后一个元素;如果执行此操作,则必须确保此值不能作为数组的一部分显示

当数组作为参数传递给函数时,它会衰减为指向数组第一个元素的指针,从而丢失有关数组长度的信息。要在接收函数(
printary
)中处理数组,需要知道数组长度的方法。这可以通过两种方式实现:

  • 用于最后一个元素的特殊终止标记。对于字符串,这是
    NULL
    。在您的示例中,如果实际数据中永远不会出现该值,则它可能是
    -1
  • 将长度参数传递给
    printary
这将为语句提供以下

//Marker value.
for(;*ptr != -1; ++ptr)
    printf("%d", *ptr);  

//Length parameter
for(int i = 0; i < length; ++i)
    printf("%d", *(ptr+i));
//标记值。
对于(;*ptr!=-1;++ptr)
printf(“%d”,*ptr);
//长度参数
对于(int i=0;i
函数需要知道数组的大小。有两种常见的方法:

  • 将实际大小传递给函数,例如

    void printArray(int *ptr, size_t size)
    {
        int *const end = ptr + size;
        while( ptr < end ) {
            printf("%d", *ptr++);        
        }
    }
    
    int main()    
    {    
        int array[6] = {2,4,6,8,10};     
        printArray(array, sizeof(array) / sizeof(array[0]) );    
        return 0;     
    }
    

  • 检查NULL技巧仅适用于以NULL结尾的字符串。对于数字数组,也必须传入大小

    void printArray(int *ptr, size_t length);            
    {         
        //for statement to print values using array             
        size_t i = 0;
        for( ; i < length; ++i )      
        printf("%d", ptr[i]);        
    }   
    
     void printString(const char *ptr);            
    {         
        //for statement to print values using array             
        for( ; *ptr!='\0'; ++ptr)        
        printf("%c", *ptr);        
    }         
    
    int main()    
    {    
        int array[6] = {2,4,6,8,10};     
        const char* str = "Hello World!";
        printArray(array, 6);    
        printString(str);
        return 0;     
    }
    
    void打印数组(int*ptr,大小\u t长度);
    {         
    //for语句使用数组打印值
    尺寸i=0;
    对于(;i
    这是答案(未经测试)

    void打印数组(int-arr[]);
    {         
    int*ptr;
    
    对于(ptr=&arr[0];ptr类似于void(int*ptr,int size){for int i=0;我只是出于好奇,指针是否有任何方法可以确定for循环中数组的大小,可能是使用指向指针的指针等。这只是我的问题guess@samprat:是的,类似这样(但别忘了也增加
    i
    )@axis,是的,我几乎忘了增加i..thanks
    *(ptr+i)
    相当于
    ptr[i]
    因此,它失去了使用指针进行迭代的意义。for循环中的前缀或后缀是否会有任何区别。在这种情况下,预增量和后增量不应该有任何区别。我习惯于编写前者,因为后一种方法涉及到创建被增量对象的临时副本。这在ca中可能非常重要SE和C++类定义了<代码>运算符++<代码>。但是在这两种情况下,它应该是相同的。上次我做C是几个月前。如果我有一个动态分配的整数数组,我必须把我传递的大小存储到<代码> MalOC ,以便使它通过循环而不游过那个块的边缘。内存,对吗?@Ungeheuer是的,如果你只有
    malloc
    返回的指针,就没有(可移植的)方法来检索分配的数组的大小@Every,谢谢你们帮我澄清了疑问。你的示例解决方案不仅解决了我的主要问题,还帮我澄清了一些疑问。谢谢
    void printArray(int *ptr, size_t length);            
    {         
        //for statement to print values using array             
        size_t i = 0;
        for( ; i < length; ++i )      
        printf("%d", ptr[i]);        
    }   
    
     void printString(const char *ptr);            
    {         
        //for statement to print values using array             
        for( ; *ptr!='\0'; ++ptr)        
        printf("%c", *ptr);        
    }         
    
    int main()    
    {    
        int array[6] = {2,4,6,8,10};     
        const char* str = "Hello World!";
        printArray(array, 6);    
        printString(str);
        return 0;     
    }
    
     void printArray(int arr[]);            
    {         
       int *ptr;
    
       for(ptr = &arr[0]; ptr <= &arr[5]; ptr++)
       {
           if(ptr != null)       
                printf("%d", *ptr);
    
          ptr++;   // incrementing pointer twice, as there are ‘int' values in array which
                   //are of size 2 bytes, so we need to increment it twice..
       }       
    }         
    
     int main()    
    {    
        int array[6] = {2,4,6,8,10};     
        printArray(array);    
        return 0;     
    }