C语言学习(一)指针

221 阅读2分钟

基本概述

在C语言中,使用int、float、char等值类型定义的作用是申请一块相应大小的内存地址,用来保存数据。

如果要在函数之间传递这些数据、就需要有两种方式,第一种是数据拷贝,将数据拷贝到函数运行时创建的形参地址中去,再使用,第二种就是指针传递数据地址给函数内部,函数内部再使用数据。

void test(int *a) // 指针形参 保存函数调用传进来的内存地址。
{
    int c = *a; // 解引用 读取a指针指向的地址里面的内容
}
int main()
{
    int b = 1000;
    test(&b); // &b获取变量b所在的内存地址
}

注意事项:

1int *a,和char *a 这俩指针变量占据的内存空间是一样的。

2、 不能返回指向函数内部的变量地址的指针,函数执行结束,内部变量会回收。

3const int *a 指针指向的变量是个常量、。
4int *const a是指针本身是一个常量,在用之前就需要初始化。

指针数组和数组指针

指针数组

类似 int *a[] 作用是,数组的内容都是指针。

示例:

#include <stdio.h>
int main()
{
    int *a[5] = {0};
    int b = 2;
    int c = 3;
    int d = 4;
    a[0] = &b;
    a[1] = &c;
    a[2] = &d;
    printf("输出的数值是%d,%d,%d \n", *a[0], *a[1], *a[2]);
}
// 输出的数值是2,3,4 

数组指针

类似int (*a)[]

示例:

#include <stdio.h>
int main()
{
    char(*a)[4];
    char str[12] = {'a', 'b', 'c', '\0', 'd', 'e', 'f', '\0', 'g', 'h', 'i', '\0'};
    a = (char (*)[4])str;
    printf("输出的数值是%s,%s,%s \n", a, a + 1, a + 2);
}
// 输出的数值是abc,def,ghi 

以上这种声明定义方式的作用是声明一个指针部长为sizeof(类型)*[长度] 的指针,采取这种方式的好处是可以灵活的控制指针步长来进行访问。

像上面的demo,就是步长为sizeof(char) *4 所以是 a+1之后直接访问到'd'。

这里需要注意的是类型的转换,char数组本身可以理解为char 类型,要把这个地址赋值给char ()[4] 这个类型,就需要进行一个强制类型转换。