美文网首页
c语言-----指针

c语言-----指针

作者: 26小瑜儿 | 来源:发表于2019-08-04 20:50 被阅读0次

    c语言-----指针

    1.声明/定义变量的时候 表示一个指针变量

        float b = 20;
        int c = 10;
        int *a;    //定义一个指针变量 指向的内存空间只能存放整数
       // 注意:定义指针变量的时候一定要给初值 不确定就给NULL
        int *a = b;//不行 指针变量只能存地址 不能存具体值
        int *a = &b;//不行 整形指针只能存整形数据的地址
        int *a = &c;//正确
        float *d = NULL;NULL指向内存的起始地址 0x00
    

    2.除了定义指针变量之外 都是访问某个地址的值

         int *temp = &c;//定义指针变量l
        *temp = 21; 访问temp地址里面的数据 赋值为21
        //‘&’ 取某个变量的地址
    

    3.要学好指针就要抓住两点 (1)地址 (2)内存空间
    为什么要用指针:解决跨区域(不同作用域 不同代码块)之间的数据交互
    指针最忌讳的:野指针:也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。
    注:指针变量在内存里面占据8个字节空间

    int main(int argc, const char * argv[]) {
    int a = 10;

    int *pa = &a;
    int a2[10] = {};
    
    int *pa2 = a2;
    int(*pFunc)(int) = test;
    
    char c = 'a';
    char *pc = &c;
    printf("%lu\n",sizeof(a)); //4
    printf("%lu\n",sizeof(pa));//8
    printf("%lu\n",sizeof(a2));//40
    printf("%lu\n",sizeof(pa2));//8
    printf("%lu\n",sizeof(pFunc));//8
    printf("%lu\n", sizeof(pc));//8
    

    4.数组与指针在内存上的差别:
    数组名并不是一个变量 没有分配内存空间 int a = 10;
    指针变量是有内存空间
    定义一个数组 系统会分配内存空间 可以存值
    int num[10] = {};
    定义一个指针变量 只为变量本身分配8个字节内存空间
    (无法存值,因为没有为他分配可以存值的内存空间)
    int *p;
    给指针指向的区域赋值:
    1.指针变量已经指向某块区域
    int a3 = 10;
    int *pA = &a3; //指向变量a的内存地址
    *pA = 30;

    2.指针指向一个数组
    int num2[10] = {};
    int *pNum = num2; //指向数组num2的首地址
    *(pNum+0) = 20; 等价于 pNum[0] = 20;
    *(pNum + 1) = 30; 等价于 pNum[1] = 30;

    C语言————动态存储

    3.动态分配内存
     三个点:  malloc    realloc    free
    上面两种指向的内存都是别人的,是系统分配的,一般当出了作用域 内存就会被释放。
    

    而此方法希望分配一个属于自己的内存空间
    自己分配的内存空间必须自己释放
    注:普通变量的内存是系统自己分配 所以系统自己负责释放

    char *pName = malloc(3 * sizeof(char));
    //判断分配是否成功
    if(pName == NULL){
    //分配失败
    exit(EXIT_FAILURE);
    }
    //若分配成功,使:
    pName[0] = 'j';
    pName[1] = 'a';
    pName[2] = 'c';

    //当之前分配的内存空间不够了 就需要在之前的基础上重新分配
    //realloc 必须是之前使用malloc分配过的
    //malloc分配的内存不够用时,用realloc增加分配内存 并将malloc 上的内容复制过去 并将之前malloc分配的内存清除
    //如果是系统分配的内存 是不能使用realloc的
    //用完了就要自己释放内存
    pName =  realloc(pName, 4*sizeof(char));
    pName[3] = 'k';
    
    printf("%s\n", pName);
    free(pName);
    
    return 0;
    

    }

    C语言————结构体

    结构体 是一种复合数据类型
    //struct
    //声明一种类型 struct Person == int
    struct Person {
    char name[10];
    char *addr;
    int age;
    };

    // int i1 = 10;
    // struct Person zs = {"张三", 20};
    //定义结构体struct Person变量 变量名xw

    int i;
    i = 20;
    struct Person xw;
    //xw.name = "小王";此用法错误!!  *数组一旦定义 地址不能改变
                    //不能直接给数组赋值
    xw.name[0] = 'x';//系统为这个变量分配内存了
    xw.name[1] = 'w';
    
    //xw.addr = "西南大学";此用法正确   *常量字符串的地址是由系统分配的
    //先为addr分配内存
    xw.addr = malloc(4 * sizeof(char));
    xw.addr[0] = 'S';//字符指针赋值 必须要有内存
    xw.addr[1] = 'o';
    xw.addr[2] = 'u';
    xw.addr[3] = 't';
    xw.age = 30;
    printf("name:%s\n", xw.name);
    printf("addr:%s\n", xw.addr);
    

    C语言————文件操作

    写入数据:

    int main(int argc, const char * argv[]) {
    //打开文件
    //fopen("abc.txt",const char *restrict __mode) ;
    FILE *fp=fopen("C:/Users/12931/Desktop/abc1.txt","w");
    //写入结构体
    struct Student{
    char name[10];
    int age;
    };
    struct Student xw1={"小红",20};
    fwrite(&xw1,sizeof(struct Student),1,fp);
    fclose(fp);
    return 0;
    }

    读取数据:

    int main(int argc, const char * argv[]) {
    //打开文件
    //fopen("abc.txt",const char *restrict __mode) ;
    FILE *fp=fopen("C:/Users/12931/Desktop/abc1.txt","r");
    //写入结构体
    struct Student{
    char name[10];
    int age;
    };
    struct Student xw1;
    fread(&xw1,sizeof(struct Student),1,fp);
    printf("name: %s\n",xw1.name);
    printf("age: %d\n",xw1.age);
    fclose(fp);
    return 0;
    }
    心得:
    此次指针学习让我感受到了C语言的精髓所在,动态分配内存更是让我大开眼界 感觉牛逼的亚子,当然,指针的确比较难,有好多地方像是在读无字天书,就是懂不了,链表更是听的云里雾里,似懂非懂的。感觉自己不懂的还有好多,不过今天也学习了好多指针、结构体、动态分配内存的基础知识,也算很有收获!

    相关文章

      网友评论

          本文标题:c语言-----指针

          本文链接:https://www.haomeiwen.com/subject/gftjdctx.html