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就是二级指针 复制代码
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个字节,浪费的空间小
传值:直接开辟一个和原结构体相同大小的空间,浪费空间,会导致压栈问题
所以我们更倾向于传址方式