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

C语言数据类型

  1. 基本数据类型
  • char
  • short
  • int
  • long
  • double
  • float
  1. 构造类型
  • 数组
  • 结构体 struct
  • 共用体 union
  • 枚举类型 enum
  1. 指针类型
  2. 空类型 void

基本类型使用的占位符

  • int---------%d
  • float---------%f
  • double---------%lf 或者 %f
  • short---------%d
  • long---------%d
  • char---------%c
  • char * ---------%s
  • & (取地址符)--------%p

关于布尔类型:

非0即true, 0就是false

基本类型占用的字节数

  • int---------4 字节
  • float---------4 字节
  • double---------8 字节
  • short---------2 字节
  • long---------8 字节
  • char---------1 字节
  • char * ---------8 字节

地址

C、C++(对象) 万物皆指针,指针就是地址,& 符号是用来取地址的

变量的地址

    int number_int = 100;
    double number_double = 200;

    printf("number_int的地址是:%p\n", &number_int);
    printf("number_double的地址是:%p\n", &number_double);

number_int的地址是:0x16f60f3d8
number_double的地址是:0x16f60f3d0

获取变量的值有三种方法:

  1. 在取出的地址前面加 * 就能再次得到变量所赋予的值
    printf("number_int的值是:%d\n", *(&number_int));
    printf("number_double的值是:%lf\n", *(&number_double));
  1. 赋值给指针
    int * intP = &number_int;
    double * doubleP = &number_double;

    printf("number_int的值是:%d\n", *intP);
    printf("number_double的值是:%lf\n", *doubleP);

  1. 最直接的输出
    printf("number_int的值是:%d\n", number_int);
    printf("number_double的值是:%lf\n", number_double);

三种方法展示的最后的结果:

number_int的值是:100
number_double的值是:200.000000

数组的地址

数组就是一个内存地址,所以数组的内存地址是它自己本身,也是它第一个元素的内存地址

    int arr[]  = {1,2,3,4};

    printf("arr  =   %p\n", arr);
    printf("&arr  =   %p\n", &arr);
    printf("&arr[0]  =   %p\n", &arr[0]);

输出的结果:

arr = 0x16fabf3c0
&arr = 0x16fabf3c0
&arr[0] = 0x16fabf3c0

数组地址的移动寻值

我们可以将数组地址赋值给指针,通过挪动指针,取出对应地址的值

 int arr[]  = {1,2,3,4};

 int * arr_p = arr;
 printf("%d\n", *arr_p);//取出元素一内存地址的值 1

 arr_p ++; // 指针向后挪动一位  获取元素二的内存地址
 printf("%d\n", *arr_p); // *arr_p 取出元素二内存地址的值 2

 arr_p += 2;// 指针在元素二的位置向后挪动两位
 printf("%d\n", *arr_p); // 取出元素四内存地址的值 4

 arr_p -= 3; // 挪动指针指向到 元素一
 printf("%d\n", *arr_p);//取出元素一内存地址的值 1

 arr_p += 60; //挪动指针指向往后的第 60 位
 printf("%d\n", *arr_p); // 取出的值由于超过数组,所以展示的是系统值

1
2
4
1
1836497649

指针、内存地址、指针别名的理解

  1. 指针:就是内存地址
  2. 内存地址:就是指针
  3. 指针别名:指针变量,是指针的变量

指针

在取出的地址前面加 * ,表示拿到该地址所对应的值

通过指针修改变量的值

    int i = 100;

    int * p = &i;
    *p = 300;

    printf("i的值是:%d\n", i);

输出结果:

i的值是:300

函数

函数的三点注意事项

  • C语言与 Java 和 C++ 不同,C语言不允许函数重载
  • 函数要先声明,再实现
  • 如果忘记声明,函数要写在 main 方法前面,否则会报错

由于C语言不支持函数重载,所以声明的函数,参数可写可不写

通过函数修改数值

void changeValue(int * temp);//函数声明

int main() {
    int i = 1;
    changeValue(&i);

    printf("i的值是:%d\n", i);
    printf("main函数,i的内存地址是:%p\n", &i);

    return 0;
}

//函数实现
void changeValue(int * temp){
    printf("changeValue函数,i的内存地址是:%p\n", i);
    *temp = 886;
}

main 函数中的 i 和 changeValue 函数 temp 的内存地址是一样的

输出结果:

changeValue函数,i的内存地址是:0x16d72f3d8
i的值是:886
main函数,i的内存地址是:0x16d72f3d8

通过函数交换数值

void changeAction(int * a, int * b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int a = 4000;
    int b = 200;
    printf("交换前的效果:a=%d,\tb=%d\n", a, b);

    changeAction(&a, &b);
    printf("交换后的效果:a=%d,\tb=%d\n", a, b);
}

输出结果:

交换前的效果:a=4000, b=200
交换后的效果:a=200, b=4000

不论是通过函数修改数值还是交换数值,都是接收的指针(即内存地址)

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