指针进阶---字符指针,指针数组,数组指针,二级指针接收参数

指针进阶

点击此处可以查看一些的题目[各种类型指针和数组比较困难的题目]
(https://blog.csdn.net/wang_yiduo/article/details/88739835)

  1. 字符指针

    在指针类型中,我们知道有一种特殊类型的字符指针char*,它既可以用来指向字符,也可以用来指向字符串

    代码演示:

    #include<stdio.h>
    
    int main()
    {
    	char c='w';
    	char* p1="hello";//表示指针指向字符
    	char* p2=&str;//表示指向字符串
    	return 0;
    }
    

    注意:char* p2="hello"并不是把"hello"存到了p2里面,而是把"hello"的首元素’h’的地址放到了p2里面,这样就会出现一个有趣的现象,当两个指针指向同一个字符串的时候,它们实际上会指向同一块儿内存.

    代码演示:

    #include<stdio.h>
    
    int main()
    {
    	char str1[]="hello,world";
    	char str2[]="hello,world";
    	char* str3="hello,world";
    	char* str4="hello,world";
    	if(str1==str2)
    		printf("str1和str2相同\n");
    	else
    		printf("str1和str2不同\n");
    	if(str3==str4)
    		printf("str3hestr4相同\n");
    	else
    		printf("str3hestr4不同\n");
    	return 0;
    }
    

    结果为:
    在这里插入图片描述
    原因:虽然str1和str2在做比较的时候都会被隐式转换为指针,指向数组首元素,也就是指向h,但是str1和str2本身是一个数组.每一个数组都会有内存开辟出的空间,这两个数组处于不同的内存,所以首元素的地址也不会相同,但是指针不同,当两个指针指向同一个字符串的时候,它们实际上会指向同一块儿内存,所以str3和str4相同

  2. 指针数组

    指针数组是数组,只不过数组里面的元素是指针

    书写方式:

    int * arr [ 4 ] ; // 整形指针数组
    char * arr [ 5 ] ; //一级字符指针数组
    char ** arr[ 5 ] ; //二级字符指针数组

    图示:
    在这里插入图片描述
    注意:如果想了解arr(数组名)和&arr(数组的地址)之间的关系可以看我的<<浅谈指针>>那篇博客

  3. 数组指针

    数组指针是指针,只不过它指向的是一个数组,代表的是数组的地址

    书写方式:

    int ( *p ) [ 10 ] ;

    注意:虽然说数组指针代表的是数组的地址,但是我们很少这样写:int (*p)=&arr,更多的时候我们是在二维数组传参的时候使用它

    数组指针的使用:

    #include<stdio.h>
    
    void Print1(int(*arr)[3], int row, int col)  //传数组指针
    {
    	int i = 0;
    	for (i = 0; i < row; i++)
    	{
    		for (int j = 0; j < col; ++j)
    			printf("%d ", arr[i][j]);
    		printf("\n");
    	}
    }
    
    void Print2(int arr[2][3], int row, int col)   //传数组本身
    {
    	int i = 0;
    	for (i = 0; i < row; i++)
    	{
    		for (int j = 0; j < col; ++j)
    			printf("%d ", arr[i][j]);
    		printf("\n");
    	}
    }
    
    int main()
    {
    	int arr[2][3] = { 1,2,3,4,5,6 };
    	Print1(arr, 2, 3);
    	printf("\n");
    	Print2(arr, 2, 3);
    	return 0;
    }
    

    结果为:
    在这里插入图片描述
    结论:很明显二维数组在传参的时候,既可以传它本身也可以传数组指针,因为在一维数组传参的时候我们知道可以直接传指针,指针指向数组的首元素,所以同样的道理,二维数组在传参的时候也可以传成一个指针,但是指针必须指向二维数组的首元素,而二维数组的首元素是一个数组,所以就应该传一个指向数组的数组指针

  4. 数组参数,指针参数

    一维数组传参会隐式转换为指针,二维数组传参会隐式转换为数组指针这两个概念已经讲过就不再赘述,不清楚的可以看我的<<浅谈指针>>那篇博客.

    在这里主要讨论一个问题:当一个函数的参数是二级指针的时候,函数能接收什么参数?

    首先既然是二级指针做函数的参数,那么函数肯定可以接收一个二级指针,其次我们要考虑到隐式转换的可能性,隐式转换之后指针会指向数组首元素,代表着首元素的地址,那么在什么情况下首元素的地址会是一个二级指针,很明显首元素为一级指针的情况下,它的地址才可以为二级指针,而首元素为指针的数组只能是指针数组

    结论:当一个函数的参数是二级指针的时候,函数可以接收的参数有两种:1.二级指针 2.指针数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值