文章目录
1 字符指针
1.1 代码示例 1
1.2 代码示例 2
2typedef 关键字
2.1 如何使用
2.2typedef 和 #define 的区别
2.2.1 指针连续定义
紧张刺激的寒假学习开始啦!
简单回顾一下指针的概念
内存会划分以字节为单位的空间, 每一个字节都有一个编号 (地址 / 指针)
指针变量可以存放这个地址 / 指针
注: 我们日常所说的指针, 一般是指针变量
下面让我们坐上指针进阶的, 来到第一站! 字符指针
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;
- }
它的结果如下:
在例子 1 里面我们提到过, str1 和 str2 这种情况都指向一个常量字符串
既然字符串 abcdef 无法被改变, 编译器也没有必要创建两个独立的内存空间来存放两个相同的字符串
所以 str1 和 str2 的地址是完全一样的
而 arr1 和 arr2 是完全不同的数组, 它们的首元素地址不一样, 打印的结果是不相等
第一站的距离比较短
在站台上, 我们发现了一个无人认领的袋子, 里面装着一个关键字
typedef
2typedef 关键字
2.1 如何使用
在 MSDN 中, 我们可以查找到 typedef 的定义
简单地说, 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 语句, 进行这项操作
#definePINTint*
定义语句 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 类型
你学会了吗? 我反正是学废了
嘟嘟嘟, 去下一站!
来源: https://blog.csdn.net/muxuen/article/details/122554421