C语言指针1

张开发
2026/4/14 12:12:44 15 分钟阅读

分享文章

C语言指针1
学习目标1、内存和地址2、指针变量和地址3、指针变量类型的意义4、指针运算1、内存和地址先了解内存 bit是用来存放1个2进制位 1字节 8 bit电脑的内存存储数据的方式将内存划分为一个个内存单元每个内存单元的大小取1个字节计算机将内存单元编号编号也称为地址C语言中给地址起了一个新的名字叫指针结论是内存单元的编号 地址 指针计算机中的硬件之间是相互独立的通过线来传递数据32位机器有32根地址总线每根线只有2种形态用 0 或 1 表示2、指针变量和地址int main{Int a 10; // 变量创建的本质就是像内存中申请空间Printf(%p\n,a); // %p 是专门用来打印地址的 是取地址操作符 ---- 是单目操作符Int * pa a;pa 就是指针变量* 是用来说明pa是指针变量Printf(%d\n,*p); 此处的 * 表示解引用操作符 ---- 单目操作符return 0;}为什么要用到 当一个数值有时候需要存储起来的时候为了方便后期的使用我们就会把这个地址存放起来存放到指针变量中去此时就需要用到 *a a 先取地址再解引用就是本身 解引用 取地址 的作用会抵消3、指针变量类型的意义Int main(){Int a 10;Int * pa a;Char ch w;Char * pc ch;printf(%zu\n,sizeof(pa)); 打印结果为 8 在x64的环境下 4 在x86的环境下printf(%zu\n,sizeof(pc)); 打印结果为 8 在x64的环境下 4 在x86的环境下return 0;}所以可以得出结论指针变量的大小和类型是无关的指针变量是用来存放地址的地址的存放需要多大的空间指针变量就给多大的空间x86环境下是32位环境下是有32根地址线32位的二进制序列 也就是4个字节x64环境下是64位环境下是有64根地址线64位的二进制序列也就是8个字节那么指针变量的意义是什么指针变量的大小和类型无关只要指针变量在同一个平台下大小都是一样的为什么还要各种各样的指针类型呢下面来看2个例子Int main(){Int a 0x11223344;Int * pa a;* pa 0; // 会将a中的16进制的数字变为0因为int是4个字节return 0;}Int main(){Int a 0x11223344;Char * pa a;* pa 0; // 会将c中的16进制的数字的第一个变为0 因为char是1个字节return 0;}从上面的两个例子中我们可以的出的结论是指针类型决定了对指针解应用的时候有多大的权限也就是一次性能操作几个字节4、指针的计算可以分为3类 指针 / - 整数 指针 / - 指针 指针的关系运算先来看指针 / - 整数的类型Int main(){Int a 10;Int * pa a;char * pc a;Printf(a %p\n,pa);Printf(pa %p\n,a);Printf(pc %p\n,pc);Printf(pa 1 %p\n,pa 1);Printf(pc 1 %p\n,pc 1);return 0;}char * pcpc是指向字符的解引用就应该访问1个字节的空间 / - 就应该跳过一个字节int * pa pa 是指向整数的解引用就应该访问4个字节的空间 / - 就应该跳过4个字节在这里额外说一下 void *void* 是一种特殊的指针类型也可以理解为无具体类型的指针这种类型的指针可以用来接受任何类型的地址但是也有局限性这种类型的指针不能直接进行指针的 / - 整数 和 解引用的运算指针 / - 指针的运算Int main(){Int arr[10] {1,2,3,4,5,6,7,8,9,10};Int * p arr[0];Int i 0;Int sz sizeof(arr) / sizeof(arr[0]);Printf(%d \n,*(p i)); // 指针加减整数Printf(%d ,arr[9] - arr[0]); // 指针 / - 指针的前提是 两个指针需要在同一块空间return 0;}指针的关系运算就是去判断地址的大小指针是地址地址是有大小的有大小就可以比较下面举个例子使用指针的关系运算来打印数组的类容Int main(){Int arr[10] {1,2,3,4,5,6,7,8,9,10};Int sz sizeof(arr) / sizeof(arr[0]);Int * p arr[0];While(p arr[0] sz){Printf(%d ,*p);P;}return 0;}

更多文章