指针(详解)

目录

一、字符指针

二、指针数组

三、数组指针

1.数组指针的定义

2.&数组名和数组名

3.数组指针的使用

四、 数组传参、指针参数

 1、一维数组传参

2、二维数组传参

3、一级指针传参与二级指针传参

五、函数指针

六、函数的指针数组

七、函数指针数组的指针

八、回调函数


1.指针就是一个变量(指的是指针变量),指针是用来存放地址的,地址唯一标识一块内存空间。(也就是说,内存会划分为小的内存单元,每个内存单元都有一个编号,这个编号就被称为地址,也把地址叫做指针)。

2.指针的大小是固定的,在32位系统下是4个字节,在64位系统下是8个字节。

3.指针是有类型的,指针的类型决定了指针的+-整数的步长(+1或者-1会跳过几个字节),指针解引用操作的时候的权限。

一、字符指针

指针类型有一种类型为char*(字符指针)

一般情况下,我们将一个字符的地址存放在一个字符指针变量中

int main()
{
    char ch = 'a';
    char* pc = &ch;
    *pc = 'a';
    return 0;
}

pc就是一个指针变量,里面存放的是ch的地址,当我们对指针变量pc进行解引用,就可以的到我们的字符'a';

这个我们很容易理解,但是我们还有一种常用的写法,

#include<stdio.h>
int main()
{
    const char* str = "hello";
    printf("%s\n",str);
    return 0;
}

在这里,我们就会想到,这是将一个字符串放在str的指针变量里了吗?

在这里,我们并不是将一整个字符串放在str的指针变量中了,而是将字符串的首字符的地址存放在了str中,当我们去向后访问时,访问到\n就访问结束。

#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;
}

 这里的运行结果应该是什么呢?

str1 str2是在内存中内存中开辟了两个空间,分别用来存储字符串str1 和 str2,因此str1!=str2。在str3 与 str4比较时,这里就需要注意了,这里是将hello bit这个字符串的地址分别存放在str3 和 str4中,因此这里str4 和 str3 是相同的。

二、指针数组

我们了解到数组,数组是一个存放相同类型元素的集合,我们之前学习到有

int* arr1[10];//整型指针数组
char* arr2[10];//字符指针数组
char* * arr3[10];//二级字符指针数组

指针数组,是一个用来存放指针的数组。

三、数组指针

1.数组指针的定义

当我们看到数组指针时,数组指针是数组还是指针?他应该是指针,也就是一个数组的地址,

int* p1[10];

int(*p2)[10];

在这里p1和p2分别是指的什么?

p1指的是一个整型指针数组,p1是一个数组,里面存放了10个int*类型的元素;

p2是一个指针,在这里表示p2是一个指针变量,P2指向的是一个大小为10的一个整型数组,p2因为指向一个数组,也是一个数组指针。

2.&数组名和数组名

在之前我们了解到,数组名是数组首元素地址,但是有两个情况例外,一个是将数组名在sizeof里面使用时,另一个就是&数组名,在这两种情况下数组名不代表数组首元素地址。

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("%p\n", arr);
	printf("%p\n", &arr);
	return 0;
}

上面一串代码,我们输出的时

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值