指针的理解(2)

一维数组的传参: 当传入的数组名看成是一个数组时,可以直接用一个数组去接收,数组的大小可以不写; 当传入的数组看成是元素的首地址的时候,那么便可以用一个指针去接收 int* p (*代表是一个指针的符号,p是传入的地址)

指针数组(int* arr[])一个存放指针的数组,存放的也就是一些地址,前面的类型是地址变量指向的类型: 传参 同样如果传入的数组被看做数组名可以直接用一个指针数组去接受(int* arr[])大小可以不写(但最好写)如果是元素的首地址,那么便需要用一个二级指针去接收,因为传入的地址是指针的地址(int**arr)

二维数组的传参:跟一维数组一样,接收的时候可以用二维数组接收,接收时最好定义一下大小,二维数组当成首地址传入时,传入的就是一个一维数组的首地址,那么便要用一个数组指针去接收

(int (*p)[n]) 先定义一个指针,该指针指向的是一维数组的每个元素,每个元素是int型的

一级指针可以接收的: 变量的地址,一位数组的数组名

二级指针可以接收的: 一级指针的地址,二维数组的数组名,二级指针

函数指针:指向函数的指针,跟定义数组指针一样先定义一个指针然后再看他后面指向的内容,每个内容的类型是什么

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>




 一维数组传参的接收方式
int arr[10] = {0};
test(arr);
传入数组
void test(int arr[])
void test(int arr[10]) 传入的是一个数组,那么我便用一个数组去接受(里面有无大小是另外的关系)
void test(int* arr)//  传入的是首元素的地址,该元素的类型为int 所以用一个int的指针接收它

int* arr2[10] = { 0 }; //指针数组 ,每个数组元素存放的是一个指针
test(arr2)
传入数组
void test(int* arr[10])
void test(int* arr[])
void test(int* *arr) // 传入首元素的地址,首元素的类型为指针,所以用一个指针接收它
  传入什么就用什么去接收,可以不考虑大小,如果传入的看做是首元素的大小那么就用一个指针去接收它 定义一个指针就是加个*


void test(int* p, int x) {

	for (int i = 0; i < x; i++) {
	
		printf("%d", *(p + i)); // 将地址解引用打印出来
	
	}

}
int main(){

	int arr[10] = { 1,2,3,4,5,3,1,63 };
	/*int* p = arr;*/ // 可以定义一个指针传入,也可以直接将数组名传入,数组名为首元素的地址
	int sz = sizeof(arr) / sizeof(arr[0]);

	test(arr, sz);


}


	二维数组传参
int arr[3][5]={0};
test(arr);
传入参数
void test(int arr[3][5]) 传入一个二维数组,那么我变用一个二维数组去接收(大小可以不用写)
void test(int* arr) 错误 如果看做地址 我/*传入的是是一个一位数组的地址(即一行的地址)不能用一个int型的指针来接收,只能接收一位数组的地址(还要是int类型的)
void test(int (*arr)[5]) 可以  传入的是一位数组的地址我用一个指针去接受该地址接大小为5 也可以不写大小,每个元素为int型,要用括号将*arr括起来不安然就跟上面一样只是多了大小
void test(int **arr)错误 传入的不是一个指针的地址 而是一个数组的地址 所以不能用二级指针去接受该地址




一级指针可以接收的东西

void test(int* p) {}

int a = 10;
int* p = &a; 
test(p); 变量的地址
int arrp[10] = { 0 };
test(arrp); 一维数组的数组名
int* p = arr;
test(p);   一级指针变量

 二级指针可以接收的东西
* void test(int**p) 接收一级指针的地址和二级指针
*
* int*p;
* int**p1 =&p;
* test(*p1);   一级指针的地址
* test(p1)      二级指针
* int* arr[10];
* test(arr)    指针数组的首地址




 函数指针- 指向函数的指针
 int print(int x,int y){
 
	return x+y;
 
 }
 int main() {
	
	void(*p)(int,int)= print =&print  这里不存在函数的首地址  定义函数指针时先定义一个指针*p然后它指向的是一个函数的参数(int x,int y)然后返回类型是int
		(*p)(x,y)
 
 }
 void *pfun() 这里应该是pfun是一个函数名 返回的类型是void*
 void (*pfun)() 这里是一个函数指针,*pfun指向的是一个函数里面没有参数,返回的是一个void的类型 */
void add(int x,int y){

return x+y;
}
int main(){

int a=0;
int b=0;
int (*P)(int,int)=add;
(p)(2,3) //利用指针函数调用函数时 有*无*都是一样的


}
 
 

int (*p)(int x,int y)=arr; 这里不存在首地址 &arr和arr 一样的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值