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

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

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

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


上一篇:New Year Garland(dp+组合数学)


下一篇:C语言实现字符串格式时间转换时间戳