这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战」
最近,想复习一下C语言,所以笔者将会在掘金每天更新一篇关于C语言的文章! 各位初学C语言的大一新生,以及想要复习C语言/C++知识的不要错过哦! 夯实基础,慢下来就是快!
5.地址,数组与指针的概念
问:地址可以比较大小吗?
地址可以比较大小,地址本质是个16进制的数值
指针中存储的是地址,地址可以看成一个数据,因此是可以比较大小的
复制代码
指针和数组的关系?
指针和数组毫无关系
数组:
数组:是一块连续的空间,放的是相同类型的元素
数组和数组大小,元素类型,元素个数有关系
复制代码
如: 1.int arr[10];
数组arr的类型为: int[10] 去掉数组名就是数组的类型
2.int arr2[5]
数组arr2的类型为:int[5]
arr和arr2是不同的数组
int(*pa)[10] = &arr; //pa是数组指针
int(*pa2)[5] = &arr2;
复制代码
去掉数组名->数组的类型
去掉数组名和元素个数->数组存放的元素类型
关于数组名的理解
数组名是首元素地址
但是有两个例外:
1.sizeof(数组名)-这里的数组名代表的是整个数组,计算的是整个数组的大小,单位是字节
2.&数组名-取出的是整个数组的地址
&数组名+1:跳过整个数组
扫描二维码关注公众号,回复:
13281839 查看本文章
指针:
指针:是一个变量,存放地址
指针是变量,是变量就有地址。所以指针变量也有自己的地址
指针变量的大小:4byte(32位平台) 8byte(64byte平台)
int a = 10;
int* p =&a;
// * 说明p是指针,int:说明p指向的类型为int类型
int** pp = &p; //pp就是二级指针
复制代码
![image-20211116172658321](E:\Believe everything maybe true\Bit\C\初阶指针\初阶指针.assets\image-20211116172658321.png)
6.指针数组
指针数组是数组
int main()
{
int a = 10;
int b = 20;
int c = 30;
int* arr[3] = {&a,&b,&c};
int i = 0;
for(i = 0;i < 3;i++)
{
printf("%d\n",*(arr[i]));
//也可以不加括号,因为[]的优先级比*高
printf("%d\n",*arr[i]);
}
return 0;
}
复制代码
7.指针与结构体
关于结构体
结构体可以在main函数内部定义,但不建议
结构体类型定义并不占用空间 实际定义结构体变量才占用空间****
全局的结构体,未初始化,编译器会给它的变量默认初始化为0
**静态区的变量不初始化默认为0 **
静态区:static,全局变量
typedef struct Book
{
char name[20];
float price;
char author[20];
}Stu; b1, b2; //b1,b2是全局变量,存放在静态区
//typedef重命名类型名字 Stu ==struct Book 类型名
//传值
void Print(Stu b1)
{
printf("%f %s %s\n", b1.price, b1.author, b1.name);
}
//传址-结构体指针接收
void Print2(Stu* b1)
{
printf("%f %s %s\n", b1->price, b1->author, b1->name);
}
int main()
{
struct Book b3 = { "Mango",19.0,"Lemon" }; //b3是局部变量,存放在栈区
Print(b3);//传值
Print2(&b3); //传址
return 0;
}
复制代码
对于上面两种传结构体的方式:传值,传址
传地址:只传过去4个字节,浪费的空间小
传值:直接开辟一个和原结构体相同大小的空间,浪费空间,会导致压栈问题
所以我们更倾向于传址方式
今天就先到这吧~感谢你能看到这里!希望对你有所帮助!欢迎老铁们点个关注订阅这个专题! 同时欢迎大佬们批评指正!