int **p 、int (*p)() 、 int (*p)[5] 和int (**p)()

int **ptr 与 int ptr[4][4] 的区别???


*(*(ptr+1)+2);相当于ptr[1][2];
**p可以理解成*((*p+0)+0);相当于ptr[0][0];  

区别在于:int **ptr定义了一个指针(具体的,二级指针),它使得编译程序使程序在运行时分配一点点内存用来存放这个指针——某个数值,它标明了内存中的某个位置; 而int ptr[4][4]定义了一个二维数组,它使得编译程序让程序在运行时在内存中分配sizeof(int)*4*4个字节用来存放数据。int **ptr中定义的ptr是一个变量,如果需要,你可以随时变换它的值——它也仅仅是一个值;而int ptr[4][4]中定义的ptr本身是一个常量.这个常量用来使编译器明白你所引用的是那个你已经为其分配过内存的数组,ptr这个引用的有效性依赖于 编译器,编译器会直接把它替换成某个常量——在运行时,根本没有任何内存空间来把这个值当作变量存放,它存在于代码中,是在连接时已经指定好的,一般的, 程序本身没有权利再去改变它。

一句话,int **ptr是一个可变的句柄,你可以让它指向任何你感兴趣的内容(一般的,你准备把这个内容当作一个二维数组看待),它并没有分配任何存放实际数据的空间 ——这也是它不必要指定大小的原因,而int ptr[4][4]是一个空间,当然,这个空间附送了你一个引用它的句柄,这个句柄既然是配合这个空间附送给你的,当然它值用于引用这个空间,所以它是不 可变得。

int (*ptr) ();是什么意思啊? ptr又是什么意思啊?

是一个函数指针
首先PTR与*结合,说明是一个指针,然后与()结合,说明该指针指向一个函数,然后与INT结合,说明函数的返回值为INT型,所以是一个指向 一个返回值为INT型的函数 的指针

#include

int max(int x,int y)
{
return(x>y?x:y);
}

void main()
{
int (*ptr)();
int a,b,c;
ptr=max;
scanf("%d,%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}

ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数, 实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你像怎么做了。在程序中把 哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数,不过注意,指向函数的指针变量没有++和--运算,用时要 小心。

c语言:设int(*ptr)[5];则其中的ptr是()

a)5个指向整型变量的指针
b)指向5个整型变量的函数指针
c)具有5个指针元素的一维数组
d)一个指向具有5个指针元素的一维数组的指针


int a[] = {1,2,3,4,5,6}; 则int (*ptr) = a; int *p = a[0] 有什么区别


int (*ptr) 和int *p 本身是没有什么区别的,都是定义一个指针
只不过名字叫的不同而已,a表示数组的首地址,确切的说法应该是数组的第1个元素的地址,即在这里是a[0]的地址 .int *p = a[0]不能表达正确意思。

下面几个是等价的写法
int (*ptr)=a; //ptr指向第一个元素1
int *q=a; //q指向第一个元素1
int *p=&a[0]; //p指向第一个元素1

给个程序你验证下把
#include <iostream>
using namespace std;
void main()
{
int a[] = {1,2,3,4,5,6};
int (*ptr)=a; //ptr指向第一个元素1
int *q=a; //q指向第一个元素1
int *p=&a[0]; //p指向第一个元素1
//输出验证
cout<<(*ptr)<<endl;
cout<<*q<<endl;
cout<<*p<<endl;
}

解释一下 typedef int (*fn_ptr)(); (无内容)

msdn里面有这样一个例子:
typedef int (*funcptr)();   // funcptr is synonym for "pointer
                        // to function returning int"
funcptr table[10]; // Equivalent to "int (*table[10])();"
应该能看明白了吧?
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值