关于指针的问题

时间:2013-01-20 12:33:49

标签: c pointers function-pointers void-pointers

  

可能重复:
  In C arrays why is this true? a[5] == 5[a]

  1. 如果p是一个指针(比如int * p),那么[p]意味着什么? 4[p]的含义是什么? (即将标量乘以[p])

  2. 假设xyz是程序中定义的某种数据类型。 那么

    是什么
    void (*xyz)(void);
    
    声明是什么意思?

4 个答案:

答案 0 :(得分:6)

  1. 4[p]表示与p[4]相同。参见例如http://c-faq.com/aryptr/joke.html

  2. 如果xyz已经是数据类型,那就是错误。如果没有,那么它就是一个名为xyz的函数指针的定义。假设您的意思是“void”而不是“coid”,那么cdecl.org会告诉我们:

      

    声明xyz为指向function(void)返回void

    的指针

答案 1 :(得分:3)

如果p被定义为int *p

[p]错了!导致错误:‘[’令牌之前的预期表达式。

0[p]的正确位置!

0[p]p[0]相同,同样p[4]4[p]

编译器将p[4]转换为*(p + 4)*(4 + p) => 4[p]

另外,假设您有数组int a[10],则可以a[i]或{{1}访问数组元素}

以下示例将非常有用,我认为

i[a]

编译和执行:

int main(){
    int a[5] = {1,2,3,4,5};
    int* p;  // similar declaration of p (you asked)
    p = a;
    int i= 0; 
    for(i=0; i < 5; i++){
        printf("a[i] =  %d  and i[a] = %d \n",a[i],i[a]);
    }
    printf(" using p \n"); // access using pointer.  
    for(i=0; i < 5; i++){
        printf("p[i] =  %d  and i[p] = %d \n",p[i],i[p]);
    }
}    

[ANSWER-2]

声明:~$ ./a.out a[i] = 1 and i[a] = 1 a[i] = 2 and i[a] = 2 a[i] = 3 and i[a] = 3 a[i] = 4 and i[a] = 4 a[i] = 5 and i[a] = 5 using p p[i] = 1 and i[p] = 1 p[i] = 2 and i[p] = 2 p[i] = 3 and i[p] = 3 p[i] = 4 and i[p] = 4 p[i] = 5 and i[p] = 5 创建void (*xyz)(void);指向函数的指针,该函数返回xyz且参数为void。 (void不是数据类型,而是指针变量,例如

xyz

然后void function(void){ // definition } void (*xyz)(void); 可以分配xyz的地址:

function

使用xyz = function; ,您可以致电xyz()function()的示例:

void (*xyz)(void)

现在编译并执行它:

#include<stdio.h>
void function(void){
    printf("\n An Example\n");
} 
int main(){
    void (*xyz)(void);   
    xyz = function;    
    xyz();
}

答案 2 :(得分:2)

  

[p]是什么意思?

本身没什么。

  

4[p]的含义是什么?

由于指针算术,4[p]表示*(4 + p),假设加法是可交换的,相当于*(p + 4),而p[4]又可以写为p,一世。即它是xyz指向的数组的第5个元素。

  

如果void (*xyz)(void);是数据类型,那么xyz语句是什么意思?

然后是语法错误。

如果xyz不是数据类型,则它声明void是一个函数指针,并且返回{{1}}(即“无”)。

答案 3 :(得分:2)

1)4 [p]与p [4]相同,两者基本上均为*(p + 4),表示从数组p开始的第5个元素。

2)xyz是一个指向函数的指针的类型,该函数接受无争论并且不返回任何内容。

typedef void (*xyz)(void);    

void func();

xyz f= func;

如果在以下时装中使用

,它也可能是函数指针本身
//imagine the above typedef is omitted.

void (*xyz)(void) = func;

void (*xyz)(void);  // uninitialized pointer.