美文网首页
C语言-指针入门与基本数据类型

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

作者: 大虾啊啊啊 | 来源:发表于2022-07-27 10:38 被阅读0次

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语言学习(第一天)

    C语言基本数据类型 输入和输出函数 指针入门 C语言指针实现数据交换 指针的常见错误 不可以使用已经被回收的变量 ...

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

    1.程序入口 2.函数 2.基本数据类型占位输出 3.基本类型占用的字节数 4.初次感受,万物皆地址

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

    C语言数据类型 基本数据类型 char short int long double float 构造类型 数组 结...

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

    1、基本数据类型 2、指针 指针用于存放内存地址&a,表示取a的地址,int * a,表示int类型的指针变量a,...

  • 【OC梳理】基本数据类型和基本运算

    Objective-C作为以C语言为基础的语言,其基本数据类型与C语言类似。 1.基本数据类型 基本数据类型可以参...

  • C语言-数据类型

    C语言中数据类型是什么重要的,他们是定义变量的基础。C语言中数据类型大体上可以分为:基本数据类型,构造类型,指针...

  • NULL,nullptr,null,nil,Nil,NSNull

    NULL:一般指的是C语言里指向基本数据类型以及C类型的空指针,表示空指针((void*)0)或是0,C++里NU...

  • iOS开发 -- C语言基础8(指针)

    iOS开发 -- C语言基础8(指针) 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很...

  • NDK系列(一)C语言基本了解

    基本项目结构 基本数据类型 基本数据类型所占字节数 地址与指针:在C中 万物皆地址 指针取值 使用函数的时候 传值...

  • 第3章,数据

    基本数据类型 在C语言中,仅有4种基本数据类型----整形,浮点型,指针和聚合类型(数组和结构),所有其他的类型都...

网友评论

      本文标题:C语言-指针入门与基本数据类型

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