指针这块必须牢牢把握!(初阶-下)

这是我参与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:跳过整个数组


指针:

指针:是一个变量,存放地址

指针是变量,是变量就有地址。所以指针变量也有自己的地址

指针变量的大小:4byte(32位平台) 8byte(64byte平台)


int a = 10;
int* p =&a;
// * 说明p是指针,int:说明p指向的类型为int类型
int** pp = &p;	//pp就是二级指针
复制代码

image.png

![image-20211116172658321](E:\Believe everything maybe true\Bit\C\初阶指针\初阶指针.assets\image-20211116172658321.png)

image.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个字节,浪费的空间小

传值:直接开辟一个和原结构体相同大小的空间,浪费空间,会导致压栈问题

所以我们更倾向于传址方式


今天就先到这吧~感谢你能看到这里!希望对你有所帮助!欢迎老铁们点个关注订阅这个专题! 同时欢迎大佬们批评指正!

おすすめ

転載: juejin.im/post/7032841839053012999