C语言-指针进阶

一、字符指针

指针是一个变量,是用来存放地址的,存放一个整型的地址的变量叫做整型指针,存放一个字符的地址的变量就叫做字符指针。
如果将一个常量字符串赋值给一个字符指针,字符指针存放的是字符的地址,只能放一个字符的地址,所以只能将第一个字符的地址放到里面,不能将所有的字符的地址放到里面,就像一张单人床只能躺一个人一样。
int main()
{
const char* pstr = “hello bit.”;
printf(“%s\n”, pstr);
return 0;
}
放到pstr里的地址只是h的地址。

面试题:

#include <stdio.h>
int main()
{
    char str1[] = "hello bit.";
    char str2[] = "hello bit.";
    const char *str3 = "hello bit.";
    const char *str4 = "hello bit.";
    if(str1 ==str2)
 		printf("str1 and str2 are same\n");
    else
		 printf("str1 and str2 are not same\n");
       
    if(str3 ==str4)
		 printf("str3 and str4 are same\n");
    else
		 printf("str3 and str4 are not same\n");
       
    return 0; 
}

输出结果:这里是引用

这里的知识点是如果一个字符串是常量字符串,那么这个字符串的值就不能被修改,只能使用它,那么在内存空间有限的情况下,就只用存一份就可以了,避免造成内存空间的浪费。
这就可以比方成有一个超市给了一个书包,书包比喻成内存空间,你可以去这个超市拿任何东西,然后装到这个书包里面,但是书包装满之后就不能拿了,你要向里面放一个冰块用来降温,冰块比喻成常量字符串,但你会放两块嘛?一块就够了,再放一块就会占地方,留出空间放其他好的东西。
所以题目中,指针变量str3和str4的值是相同的,它里面存放的地址是相同的,常量字符串只在内存空间中存一份,而str1和str2是不相同的,将常量字符串放到两个数组中,两个数组申请的空间是不一样的,这两个空间的地址肯定是不相同的,数组名代表首元素的地址,所以这两个数组名对应的地址肯定不相同,可以把数组比作书包,两个数组就是两个书包,两个书包放的位置肯定不一样,要各自占一个地方才能放得下。

二、指针数组

一个区域中如果放的是学生,就叫学校,如果放的是病人,就叫医院。
所以数组中如果放的是整型,就叫整型数组,如果放的是字符,就叫字符数组。
如果数组中放的是指针,就叫指针数组。

三、数组指针

1、数组指针解释

指针是一个变量,是一个容器,是用来存放地址的。
一个容器中如果放的是化妆品,它就是化妆包,如果放的是学习用品,它就是书包。
如果一个指针里面放的整型的地址,就叫做整型指针,这个指针指向一个整型数据。
如果 一个指针里面放的是数组的地址,就叫做数组指针,这个指针指向一个数组。
*这个符号标志一个变量是指针变量,这个符号就像是北极星一样,会指引方向,指针也是一样,会指向一个地方。
[ ]代表一个数组,两个中括号能够包围起来一个区域,就代表着数组。
[ ]比 *的优先级高,他俩同时出现的时候,[ ]会优先发挥作用,毕竟[ ],比较大,代表的是数组,权力比较大。
所以如果要使 * 优先发挥作用,要给 * 加一个括号,给它上一个黄马褂,权力立马就上来了。
例子:int(*p)[10],由于给了 * 一个黄马褂,所以 p优先和 * 结合,成为指针,指针指向一个数组,数组有10个元素,每个元素的类型是整型。

2、数组名,&数组名和sizeof(arr)

数组名一般代表的是首元素的地址
这里可以想象成数组就像一个棺材,里面放了很多帝王的尸体,为了后代能够找到他们,就将棺材的名字做为第一个帝王尸体的地址。
但是有例外,使用sizeof操作符,对数组名操作时,此时数组名代表的是整个数组的地址,求出的值是整个数组的大小。
使用&,取地址操作符,对数组名操作,此时数组名代表的也是整个数组的地址,所以取出来的是整个数组的地址。

3、数组指针如何使用

数组名代表首元素的地址,二维数组的元素是每一行,首元素是第一行,所以二维数组的数组名代表的地址是第一行的地址,每一行可以看作一个一维数组,所以首元素的地址是数组的地址,数组的地址要放到数组指针里面。
数组名代表数组,就像我们的名字就代表着我们一样。
给函数传参,将二维数组的数组名传给函数,使用数组指针来接收,也可以使用二维数组来接收。
这里我们想象到的是地址这个值比作了一个魂,就是孤魂野鬼的魂,指针就是一个躯壳,魂要投胎,如果是人的魂,肯定要投到人类的躯壳里面,如果是动物的魂,肯定要投到动物的躯壳里面,数组的地址肯定要放到数组指针里面才可以。

#include<stdio.h>
print_arr1(int(*arr)[3],int r,int c)
{
	int i = 0;
	for(i = 0;i < r;i++)
	{
		int j = 0;
		for(j=0;j<c;j++)
		{
			printf("%d ",*(*(arr+i)+j));
			//arr+i,对应的是第i行的地址,*(arr+i),找到的是第i行,每一行都是一个一维数组,
			//所以找到的是一个数组,数组名代表着一个数组,数组名又是第一个元素的地址,地址+i,
			//代表找到的是第i个元素的地址。
		}
	}
}
int main()
{
    int arr[3][5] = {1,2,3,4,5,6,7,8,9,10};
 	print_arr1(arr, 3, 5)return 0; 
}

四、数组传参和指针传参

1、一维数组传参

int arr1[10]={0);
test(arr1);
函数可以使用 int arr[10] 和 int arr[ ] 和 int* p接收。
元素个数可以省略,根据传过来的个数创建。
数组名是首元素的地址,所以可以用指针接收。

2、二维数组传参

int arr1[10][10]={0};
test(arr1);
函数可以使用 int arr[10][10],和int arr[ ][10] 和 int (*p)[10]接收。
用于接收的二维数组的行可以省略,列不可以省略,省略列,数组将不知道如何存放元素。
就像操场上学生排队,如果不告诉学生要排成几列,只知道几排,那就可以随意站了。

3、一级指针传参

形参为一级指针时,传给函数时,可以传什么?
可以传一级指针变量的名字,地址,一维数组的数组名

4、二级指针传参

形参为二级指针时,传给函数时,可以传什么?
可以传二级指针变量的名字,一级指针变量的地址,指针数组的数组名

五、函数指针

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值