指针定义的几种形式

本文详细解析了C语言中指针和函数指针的概念、使用方式及区别,通过实例展示了如何利用指针进行数据操作和函数调用,并探讨了二级指针与数组指针的区别。此外,还介绍了如何定义和使用指向函数的指针,以及如何通过指针变量调用函数。最后,通过具体代码实例,解释了指向函数的指针在实际编程中的应用。
1、int(*p)[4];------ptr为指向含4个元素的一维整形数组的指针变量(是指针)
2、int *p[4];-------定义指针数组p,它由4个指向整型数据的指针元素组成(是数组)
3、int(*)[4];--------实际上可以看作是一种数据类型。也就是第一个(int(*p)[4];)中定义的p的数据类型
其实你要看这种到底是什么,就是要看他最先和谁结合。 比如1中p先与*结合,那就说明p本质是一个指针;而2中p先与后面的[4]结合,说明他本质是一个数组。

int *p=&a;和
int *p;
p=&a等价。

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])();"
应该能看明白了吧?
### 数组指针定义方法 数组指针是指向数组的指针,其本质是一个指针变量,指向某种特定类型的数组。在C语言中,可以通过以下几种方式定义数组指针: #### 1. 直接定义数组指针 使用括号将指针名和`*`结合,并在后面指定数组的大小。这种方式直接声明了一个指向数组的指针。 ```c int (*pArr)[10]; // pArr 是一个指向包含10个整数的数组的指针 ``` 这种定义方式强调了`pArr`是一个指针,它指向的是一个长度为10的整型数组[^1]。 #### 2. 使用 `typedef` 定义数组指针类型 通过 `typedef` 可以先定义一个数组类型,然后用该类型来声明指针变量,这样可以提高代码的可读性和可维护性。 ```c typedef int ArrayType[10]; // 定义一个数组类型,表示长度为10的整型数组 ArrayType *pArr; // pArr 是一个指向该数组类型的指针,即数组指针 ``` 也可以合并为一行: ```c typedef int (*PArrayType)[10]; // 定义一个数组指针类型 PArrayType pArr; // pArr 是一个指向长度为10的整型数组的指针 ``` 这种方法允许用户创建自定义的数组指针类型,便于多次使用。 #### 3. 利用数组类型定义数组指针 可以直接利用已有的数组地址来初始化数组指针。例如,对于一个二维数组,可以使用数组指针来遍历其元素。 ```c int a[3][5]; // 定义一个3行5列的二维数组 int (*p)[5] = a; // p 是一个指向长度为5的整型数组的指针,并指向a的第一行 ``` 此时,`p`可以用于访问二维数组中的每一行数据,通过递增`p`(如`p++`)可以访问下一行[^3]。 #### 4. 使用数组指针访问数组元素 数组指针在访问数组时通常需要结合解引用操作符`*`,并通过索引访问具体元素。例如: ```c int arr[10] = {0}; int (*p)[10] = &arr; // p 指向 arr 这个数组 for (int i = 0; i < 10; i++) { (*p)[i] = i + 1; // 通过数组指针修改数组元素 } ``` 上述代码中,`(*p)[i]` 表示对指针`p`所指向的数组进行第`i`个元素的访问。 --- ### 示例代码 以下是一个完整的示例,展示如何使用数组指针访问数组内容: ```c #include <stdio.h> int main() { int arr[10] = {0}; int (*p)[10] = &arr; for (int i = 0; i < 10; i++) { (*p)[i] = i + 1; } for (int i = 0; i < 10; i++) { printf("%d ", (*p)[i]); } return 0; } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值