定义`int * p = {1,2,3};`的确切含义是什么?

时间:2014-07-20 10:32:53

标签: c arrays pointers

我正在尝试学习c。

中的指针

根据我的理解int *p={1,2,3};定义了一个指向整数数组的指针,即{1,2,3}。因此,我推断p[0]是此数组的第一个元素,即1。但是我的编译器(dev c ++)没有给出任何值并挂起输出。

如何根据2查找此数组的其他元素,3p?即有没有办法通过指针变量p获得这些值。请指导。

示例程序:

#include<stdio.h>
#include<conio.h>

main()
{
    int *p={1,2,3};

    printf("%d\n",p[0]);

    getch();
}

更新

怎么样?
int (*p)[3]={1,2,3};

3 个答案:

答案 0 :(得分:7)

int *p={1,2,3};

它是无效的C代码。 =的权限必须是指针类型的值,而不是int元素的初始化列表。

请启用所有编译器警告并修复它们。

int p[] = {1, 2, 3};

是有效的C代码。它初始化了一组3 int元素。

答案 1 :(得分:1)

#include <stdio.h>
#include <conio.h>

int main(){
    int a[] = {1,2,3};
    //int *p={1,2,3};//invalid
    int *p1=(int[]){1,2,3};//valid in C99
    printf("%d\n", p1[0]);//1
    p1=a;
    printf("%d\n", p1[0]);//1

    //int (*p)[3]={1,2,3};//invalid
    int (*p2)[3]=&(int[]){1,2,3};//valid in C99
    printf("%d\n", (*p2)[0]);//1
    p2 = &a;
    printf("%d\n", (*p2)[0]);//1

    getch();
    return 0;
}

答案 2 :(得分:0)

是的,int (*p)[3]表示指向3个整数数组的指针(我的指示器也将其称为2维指针),简单来说,它意味着它可以存储2维数组的第1行的地址,当你继续增加p时,它将指向二维数组的下一行,如下例所示。

int main(void)
{
    int ary[2][3]={{1,2,3},{4,5,6}};
    int (*p)[3]=ary;

    printf("using ary: %d %d\n",p[0],p[1]);    // outputs:2686708 2686720
    printf("using ptr: %d %d\n",ary[0],ary[1]); //outputs:2686708 2686720
    return 0;
}

我认为你忘记了指针的基本属性,它们用于存储其他变量的地址,你不能像在例子中那样初始化指针,这只适用于字符串,我觉得你在尝试以字符串的方式初始化整数指针。

char *ptr="hello";         //correct 
char *ptr[]={"hi","bye" } // correct
int *pttr=123;            //Not Correct 
int *pttr[]={{123},{456}} //Not Correct