Visual Studio 2019 解决方案的多项目应用
在讲述变量,数据类型,运算符和表达式以及程序流程控制,数组,函数的相关内容,所有的代码都放在解决方案c-core的c-core-foundational项目下。
如果你有其他编程语言经验,类似于C++,Java,Python,Go语言它们都会有这些最最基本的内容,而且语法结构都很类似(但不完全相同)。
![c2fe0b8eda38231c3a74542aa772f423.png](https://i-blog.csdnimg.cn/blog_migrate/1542efc0fbef1ad738fe6281ac54542f.jpeg)
而Visual Studio 2019的单个解决方案支持多个项目,因此指针以后的内容都会放在c-core-advanced项目下。
![8a736b1a76943b7fcd09bac5410cbdc8.png](https://i-blog.csdnimg.cn/blog_migrate/a5e3f2434c18fa73438a2c24073f5134.jpeg)
但是Visual Studio 2019在编译单个解决方案下的多项目时,只能启动一个项目来参与编译和运行。
因此我们需要指定一个项目为启动项,设置为启动项后编译运行时,只有该项目会参与编译。
![bf478661b5de23733acb2ccbb91e0314.png](https://i-blog.csdnimg.cn/blog_migrate/299f213e12dfd93330b982eca2073df2.jpeg)
设置启动项
指针基础
指针与指针变量
32位编译器上的程序运行时,系统会给程序随机分配一段内存空间,这段空间的最小单位是字节,每个字节都有自己的唯一编号,而32位编译器能寻址的范围按照十六进制表示是0x00000000到0xffffffff,这个编号就是指针。
整型变量用于存储整数的变量,而指针变量就是存储指针(地址或者编号,例如0x00000001)的变量,因为32位编译器的地址编号的范围是0x00000000到0xffffffff,因此指针变量的大小是4个字节。 64位编译器能寻址的范围是0x0000000000000000到0xffffffffffffffff,因此64位编译器的指针变量占据8个字节。
指针变量的定义、声明和初始化
首先回顾下变量的声明和赋值,这里以大家熟悉的整型变量定义为例int number; 表示在内存中开辟四个字节,假设number变量的内存地址是0x00000002number = 10; 表示将内存地址0x00000002代表的那块空间的内容修改为10
C语言中通过地址符&加上变量名就可以获取变量的地址,即&number表示number的地址。
而C语言中*加上变量名表示一个指针类型的变量,例如*p,其中指针的变量名是p,当然也可以是任何合法的标识符,例如p_int,那么声明定义一个指针变量呢?
声明指针变量有三个步骤
1.*加上变量名表示为指针变量,例如*p,p表示指针变量名
2.要保存变量的地址,将变量的声明放在此处,例如int number;表示声明一个整数变量
3.将*p 替换声明的变量名,例如 int number 使用*p 替换后就是 int *p
因为指针的本质就是变量内存地址,那么给指针变量赋值也就是变量的地址,即p =&number;
而指针变量的定义就是将指针变量的声明和赋值写在一行
int *p=&number;
其中 p是指针变量的名字,而p的类型是就是将变量p本身去掉后剩下的类型就是指针变量的类型,这里就是int *
指针变量p保存什么数据类型的地址,就是去掉变量p与其离的最近的一个*后剩下的类型就是保存地址的数据类型,这里就是int
例如多级指针变量int **p 的指针变量类型是int **,p保存地址的类型就是int *
我们还可以根据声明指针变量三个步骤来定义其他类型的指针变量,例如字符指针,数组指针,代码片段如下
//使用指针变量保存char类型变量的地址char ch = 'x';char *p_char=&ch;//输出指针变量p_char的内存地址printf("p_char = %p", p_char);//使用指针变量保存整数数组类型变量的地址int numbers[10] = {1,2,3,4,5,6,7,8,9,10};int (*p_array)[10]=&numbers;//输出指针变量p_array的内存地址printf("p_array = %p", p_array[10]);
指针变量的定义,声明和初始化
#define _CRT_SECURE_NO_WARNINGS#include #include /*指针变量的定义,声明和初始化@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/25*/int main (int argc, char* argv[]){int number = 10;//指针变量用于存放变量的地址//那么如何声明指针变量呢? 指针变量是什么类型/*声明指针变量的三步骤1. *加变量名表示指针变量,例如*p,p表示指针变量名2. 要声明指针变量,将变量的声明形式放在此处,例如 int number;3. 使用*p替换声明的变量名,例如 int number 使用`*p` 替换后就是 `int *p`*///声明指针变量int *p;/**与p结合代表是一个指针变量,p是变量名p是变量,该变量的类型是将变量p去掉剩下的类型就是指针变量类型,即int *指针变量p保存什么数据类型的地址? 去掉指针变量p与指针变量p离得最近的一个*后剩下的数据类型就是指针变量p保存的数据类型的地址,即int而多级指针 int **p ,p是变量,p的类型是int ** ,而p保存的类型是int **///指针变量赋值p = &number;printf("p = %p",p);//使用指针变量保存char类型变量的地址char ch = 'x';char *p_char=&ch;//输出指针变量p_char的内存地址printf("p_char = %p", p_char);//使用指针变量保存整数数组类型变量的地址int numbers[10] = {1,2,3,4,5,6,7,8,9,10};int (*p_array)[10]=&numbers;//输出指针变量p_array的内存地址printf("p_array = %p", p_array[10]);system("pause");return 0;}
程序运行结果
![0b3d6beb6f61ee4c5b5de9066c005887.png](https://i-blog.csdnimg.cn/blog_migrate/9d4705a097c3fd3797abf5cc7decc8b5.jpeg)
指针变量的使用
指针变量保存了变量的内存地址就可以操作变量代表的那块内存空间,在使用时*p表示p指向那块内存地址的空间内容,即可以通过*p间接修改变量的内容。
指针变量和普通变量一样,可以多次被赋值,即指向别的内存空间的地址。
&可以获取一个变量的内存地址,但是不能取寄存器变量,因此寄存器变量不在内存中,而在CPU中,CPU没有地址。
#define _CRT_SECURE_NO_WARNINGS#include #include /*指针变量的使用@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/25*/int main(int argc, char* argv[]){int number = 100;//指针变量p指向了number的内存地址int *p = &number;printf("number的内存地址是%p",&number);printf("number的内存地址是%p",p);// 就可以通过p来操作number代表那块空间的内容//使用时*p表示取p指向number所代表那块内存空间的内容printf("*p = %d ",*p);//通过指针修改number的值*p = 80;printf("*p = %d ", *p);printf("number = %d ", number);int x = 20;//第二次指向x变量的内存空间p = &x;printf("*p = %d ", *p);printf("x = %d ", x);system("pause");return 0;}
程序运行结果
![88fcf712eef475b2a6790317baa2a98f.png](https://i-blog.csdnimg.cn/blog_migrate/fd34aac5a3b309be28d5916252c5b752.jpeg)
赋值运算符(=)两边的类型必须一致,指针变量也是如此,对于指针变量和地址符(&)而言:在使用时(例如赋值)对一个表达式取*就会对表达式减一级*,如果对表达式取&,就会加一级*。
例如p =&x;p的类型是int *,而x的类型是int,取&表示加一级*,此时=左右两边类型一致,都是int *
例如*p=80,80的类型是int,而在对于一个表达式取*就会减一级*,此时=左右两边类型一致,都是int
例如int *p; int **q; q=&*p,q的类型是int **,p的类型是int *,而对表达式取&加一级*,因此=左右两边类型一致,都是int **,*q=p
指针变量的大小
因为指针变量就是存储的变量的内存地址,而不管什么类型的指针(