C语言-指针入门与基本数据类型

1、基本数据类型

void baseDataType() {
    int i = 100;
    double d = 200;
    float f = 200;
    long l = 100;
    short s = 100;
    char c = 'd';
    // 字符串
    char *str = "daxiaaaaaa";
    // 不是随便打印的,需要占位
    printf("i的值是:%d,int所占字节:%d\n", i,sizeof i); // d == 整形
    printf("d的值是:%lf,double所占字节:%d\n", d,sizeof d); // lf == long float
    printf("f的值是:%f,float所占字节:%d\n", f,sizeof f); // f == float
    printf("l的值是:%d,long:%d\n", l,sizeof l); // d == 整形
    printf("s的值是:%d,short:%d\n", s,sizeof s); // s == short
    printf("c的值是:%c,char所占字节:%d\n", c,sizeof c); // c == char
    printf("字符串:%s\n", str); // s == String
}
i的值是:100,int所占字节:4
d的值是:200.000000,double所占字节:8
f的值是:200.000000,float所占字节:4
l的值是:100,long:4
s的值是:100,short:2
c的值是:d,char所占字节:1
字符串:daxiaaaaaa

2、指针

指针用于存放内存地址
&a,表示取a的地址,int * a,表示int类型的指针变量a,可以用于存放a的地址。*a表示取出指针变量对应地址所存放的值,也就100.

  int a = 100;
  int b = 200;
   change(&a, &b);
/**
* 交换数据
* @param a  指针a
* @param b  指针b
*/
void change(int *a, int *b) {
  int temp = *b;
  *b = *a;
  *a = temp;
}

3、多级指针

一级指针存放number的地址,二级指针p2存放一级指针p1的地址,三级指针p3存放二级指针p2的地址

/**
 * 多级指针
 */
void pointer() {
    int number = 999;
    //一级指针存放number的地址
    int *p1 = &number;
    //二级指针p2存放一级指针p1的地址
    int **p2 = &p1;
    //三级指针p3存放二级指针p3的地址
    int ****p3 = &p2;
    printf("通过三级指针取值 %d", ***p3);
}

4、数组与数组指针


/**
 * 数组与数组指针
 */
void pointerArray() {
    //数组普通使用
    int aar[] = {1, 2, 3, 4, 5, 6, 7};
    int i = 0;
    for (; i < sizeof aar / sizeof(int); i++) {
        printf("value is %d\n", aar[i]);
    }
    //数组与指针的关系
    printf("aar = %d\n", aar);
    printf("&aar[0] = %d\n", &aar[0]);
    printf("&aar= %d\n", &aar);
    printf("*aar= %d\n", *aar);

}


value is 1
value is 2
value is 3
value is 4
value is 5
value is 6
value is 7
aar = 643823296
&aar[0] = 643823296
&aar= 643823296
*aar= 1

aar 和&aar[0]和&aar的值都为643823296,意思它们都表示数组的头指针,也就是存放数组第0位数据的地址。因此*aar表示指针aar对应地址所存放的值,也就是数组第0位的值。直观的理解就是aar作为指针指向了数组的第0位。

5、数组指针的使用

  • 指针挪动
    aar表示头指针,aar赋给aarP,aarP挪动了一位,因此打印*aarP的结果为2
    int aar[] = {1, 2, 3, 4};
    int *aarP = aar;
    aarP++;
    printf("value = %d", *aarP);
  • 使用指针遍历数组
    int aar[4];
    for (int j = 0; j < 4; ++j) {
        //通过挪动指针方式遍历赋值
        *(aar + j) = j;
    }
    for (int i = 0; i < 4; ++i) {
        //通过挪动指针方式遍历
        printf("value = %d\n", *(aar + i));
    }
    for (int i = 0; i < 4; ++i) {
        //普通方式遍历
        printf("value = %d\n", aar[i]);
    }

6、函数指针

可以定义函数指针,把指针传入到另外一个函数,有点类似java的接口回调,kt的高阶函数

    //定义函数指针 p
    void (*p)(char *, int, int);
    //函数指针p 指向 callBack 这个函数
    p = &callBack;
    //调用downLoad函数,传入函数指针
    downLoad(p, "derry.png");
   // downLoad(callBack,"daxiaa.png");

/**
 * 回调函数
 * @param fileName
 * @param current
 * @param total
 */
void callBack(char *fileName, int current, int total) {
    printf("%s的下载进度为:%d/%d", fileName, current, total);

}

/**
 * ]
 * @param p  函数指针
 * @param fileName  文件名字
 */
void downLoad(void(*p)(char *, int, int), char *fileName) {
    p(fileName, 5, 10);
}
daxia.png的下载进度为:5/10

7、字符串与指针

  • 字符串声明的两种方式
    第一种方式,数据存放在栈空间,可以修改里面的值
    第二种方式,数据存放在全局区,不能修改
    char str[] = {'D', 'e', 'r', 'r', 'y', '\0'};
    str[2] = 'z'; // 这里能修改,数据存放在栈空间
    printf("第一种方式:%s\n", str); // printf 必须遇到 \0 才结束

    char * str2 = "Derry"; // 隐士  Derry+\0
    str2[2] = 'z'; // 会奔溃,为什么,不允许访问,这种方式,数据存放在全局区,不能修改
    printf("第二种方式:%s\n", str2);
  • 字符串与指针的操作
    通过指针挪动,对每一位字符小写转换,并且在lower函数中,定义了临时指针temp ,避免破坏传进来的的指针name。
// 指针的理解
    char * name = "daXXiaAa";

    // 先定义结果
    char dest[20];
    lower(dest, name);
    printf("小写转换后的结构是:%s\n", dest);


void lower(char * dest, char * name) {
    char * temp = name; // 临时指针,你只能操作,临时指针,不能破坏name指针
    while (*temp) {
        *dest = tolower(*temp);
        temp ++; // 挪动指针位置 ++
        dest ++; // 挪动指针位置 ++  目的是为了 挪动一个存储一个 挪动一个存储一个 ...
    }
    // printf '\0'
    *dest = '\0'; // 避免printf打印系统值

    printf("不能破坏 name:%s\n", name); // temp的好处就是,不会破坏name
}
不能破坏 name:daXXiaAa
小写转换后的结构是:daxxiaaa
  • 字符串拷贝
    使用strcpy拷贝函数
int main() {
    char *str ="daxoiaaa";
    char *copy;
    strcpy(copy,str);
    printf(" value is%s",copy);
    return 0;
}

你可能感兴趣的:(C语言-指针入门与基本数据类型)