地址与指针

2017-02-09  本文已影响23人  羊妞麻麻

前序:

int i = 99;
    do {
        printf("%d\n",i);
        if (i % 5 == 0) {
            printf("found one!\n");
        }
        i = i-3;
        
    } while (i >=0);

当然你也可以用其他循环方法哦。

本节导图如下:


地址与指针.png

地址与指针基本操作

int main(int argc, const char * argv[]) {
    // insert code here...
    int i = 10;
    printf("i 的地址是 %p\n",&i);//获取整形i的地址。
    
    int j = 19;
    int *k = &j;
    printf("获取k的地址是 %p\n",k);//地址
    printf("获取k的值是 %d\n",*k);//内容 使用*运算符 可以访问保存在这个地址中的数据
    printf("获取k的值是 %p\n",&k);//地址
    
    *k = 100;
    printf("修改后的k的内容是%d\n",*k);
    //通过sizeof来获取某个数据类型的大小
    printf("整型数据的大小的是%zu\n",sizeof(k));//如果是 int 结果是 4 32位 如果是指针 结果是 8 64位
    return EXIT_SUCCESS;
}

指针声明的代码规范

int main(int argc, const char * argv[]) {
    // insert code here...

    float *a;//定义一个浮点类型的变量a
//    float* a;//这样写也没有问题,但是风格不好。
    float* powerPtrA,powerPtrB;//C语言允许一行代码中声明多个变量。但是这样一写,powerPtrA就是一个float类型的指针,而powerPtrB却是一个float类型的变量。如果要为这两个变量都声明成指针,那需要如下分别加上*运算符。
    float *c, *b;//c、b都是指向float类型的指针
    
    return EXIT_SUCCESS;
}

所以,养成一个良好的编码习惯,还是很重要的哦!

引用传递

#include <math.h>


int main(int argc, const char * argv[]) {
    // insert code here...

    double pi = 3.14;
    //可以通过modf()函数将传入的double类型的数据 得到浮点数的整数部分和小数部分。
    double intergerPart;
    double fractionPart;
    
    fractionPart = modf(pi, &intergerPart);//将intergerPart的地址传入作为实参
    //获取intergerPart地址上的值
    printf("intergerPart的值 = %0.f, fractionPart的值是 = %.2f\n",intergerPart,fractionPart); //结果是:3 3.14
    
    return EXIT_SUCCESS;
} 

结构

////声明一个结构体
//struct Person {
//    float heightInMeters;//身高
//    int weightInKilos;//体重
//};

//上面的可以替换成如下写法
typedef struct{
    float heightInMeters;
    int weightInKilos;
}Person;


int main(int argc, const char * argv[]) {
    // insert code here...
//    struct Person wyy;
    Person wyy;
    wyy.heightInMeters = 160;
    wyy.weightInKilos = 96;
    
//    struct Person jack;
    Person jack;
    jack.heightInMeters = 170;
    jack.weightInKilos = 130;
    
    printf("wyy is %.2f meters tall\n",wyy.heightInMeters);
    printf("wyy weighs %d kilograms\n",wyy.weightInKilos);
    printf("jack is %.2f meters tall\n",jack.heightInMeters);
    printf("jack weighs %d kilograms\n",jack.weightInKilos);

    
    return EXIT_SUCCESS;
}


之前的代码都是栈中的内存,这类内存空间会在调用函数时由系统自动分配,并在函数结束后自动释放。
-----栈
仅有自动变量是不够的,有时候还是需要一块连续的空间来存储变量。-----堆

分配缓冲区的方法是通过malloc:

//声明一个指针变量
    float *startOfBuffer;
    //从堆分配指定字节数的内存
    startOfBuffer = malloc(1000*sizeof(float));
    //使用缓冲区
     //.....
    //释放之前分配到的内存,使之能够呗重新使用
    free(startOfBuffer);
    //将指针变量赋值为空
    startOfBuffer = NULL;

小练习。
1.试编写程序,显示float类型的数会占用多少内存。

2.mac上的short是两个字节的整数,其中的一个位会被用来保存符合(正或负)。试回答short能够保存的最小数和最大数。unsigned short只能保存无符号整数,试回答unsigned short能够保存的最大数。

记得回答问题有可能得到红包哦。

上一篇 下一篇

猜你喜欢

热点阅读