【C语言】指针进阶第一站,字符指针&typedef关键字

紧张刺激的寒假学习开始啦!

简单回顾一下指针的概念

  • 内存会划分以字节为单位的空间,每一个字节都有一个编号(地址/指针)

  • 指针变量可以存放这个地址/指针

注:我们日常所说的指针,一般是指针变量


下面让我们坐上指针进阶的🚌,来到第一站!字符指针

1字符指针

1.1代码示例1

int main()
{
	char ch = 'w';
	char* p= &ch;
	
	char* pa = "abcdef";
	return 0;
}
  • 字符变量ch里面存放了字符w
  • 字符指针p里面存放了ch的地址

指针变量pa里面存放了abcdef字符串的地址,我们并没有对这个字符串进行初始化。而是直接把它放进了指针变量pa里面。

和前两行的字符w不同,abcdef是存储在内存中的只读数据区,无法修改,即便通过指针也无法修改。

为了避免理解出错,我们一般会加上const修饰

const char* pa = "abcdef";
  • const放在*的左边

    表示const修饰的指针指向的内容,表示指针指向的内容不能通过指针来改变

    但是指针变量本身是可以改变的

  • const放在*的右边

    表示const修饰的是指针变量本身,指针变量的内容不能被修改

    但是*pa指针指向的内容是可以通过指针来修改的


1.2代码示例2

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcdef";

	const char* str1 = "abcdef";
	const char* str2 = "abcdef";

	if (arr1 == arr2)
		printf("arr1==arr2\n");
	else
		printf("arr1!=arr2\n");

	if (str1 == str2)
		printf("str1==str2\n");
	else
		printf("str1!=str2\n");

	return 0;
}

它的结果如下:

image-20220118092650885

在例子1里面我们提到过,str1和str2这种情况都指向一个常量字符串

既然字符串abcdef无法被改变,编译器也没有必要创建两个独立的内存空间来存放两个相同的字符串

所以str1和str2的地址是完全一样的

而arr1和arr2是完全不同的数组,它们的首元素地址不一样,打印的结果是不相等


🚍第一站的距离比较短

在站台上,我们发现了一个无人认领的袋子,里面装着一个关键字

typedef

2typedef关键字

2.1如何使用

在MSDN中,我们可以查找到typedef的定义

image-20220118094826049

简单地说,typedef的作用就是把一个已有的类型名换一个新的名字

typedef int* pint;

这句代码的意思是:将int*命名为pint

  • pint在使用的时候和int*完全一致
  • 我们仍然可以使用int*

在结构体里面,我们可以用typedef来缩短原有结构体定义的语句

如:将struct Stu命名为Stu

typedef struct Stu
{
	int ID[10];
	char name[10];
	int age;
}Stu;

2.2typedef和#define的区别

我们同样可以使用#define语句,进行这项操作

#define PINT int*

👆定义语句PINT为int*

2.2.1指针连续定义

先来了解一下如何正确连续定义两个指针

int*pa,*pb;//正确的连续定义

int*pa,pb;//错误
//pa是int*类型,而pb是int类型

因为这两个的情况非常容易搞混,所以我们不建议连续定义指针

typedef int* pint;
#define PINT int*

int main()
{
    pint pa,pb;//可连续定义指针
    //pa-->int*
    //pb-->int*
    PINT pa,pb;//等同于int*pa,pb
    //pa-->int*
    //pb-->int
}
  • typedef会产生一个新的变量类型
  • #define只是在对应位置进行替换

因为typedef产生了一个新的类型,pint为int*,但与int*也有不同

int pa,pb;//pa,pb都是int类型
pint pa,pb;//pa,pb都是int*类型

而我们直接用int*进行连续定义指针变量是错误的

int*pa,pb;//错误
//pa是int*类型,而pb是int类型

你学会了吗?我反正是学废了

嘟嘟嘟,去下一站!🚌

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕雪华年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值