0


指针进阶(二) (跑路人笔记)

文章目录

前言

咳咳,本文是关于之前知识点的一些小练习可以巩固一下基础废话不多讲直接开始。本文的小练习我直接以代码块加注释解决了,望大家体谅。下次加上了之前没讲到的知识点和例子。
大家期待一下(三)很快估计明天就出了。

练习

//一维数组 int a[] = {1,2,3,4};printf("%d\n",sizeof(a));//16  sizeof内包含且只包含数组名就是算他所有元素的 //字节大小相当于&aprintf("%d\n",sizeof(a+0));//4/8没有只包含数组名他就是第一个元素的地址所以是4/8 //看是64位还是32位printf("%d\n",sizeof(*a));// 4 对字符名解引用就是首元素类型是int 所以答案是4printf("%d\n",sizeof(a+1));//4 内存+1跳跃相应类型的字节类型为int跳跃四个字节printf("%d\n",sizeof(a[1]));//4 int类型的元素printf("%d\n",sizeof(&a));//4/8 虽然是数组的地址但依旧只是一个地址printf("%d\n",sizeof(*&a));//&a得到的数组的元素地址对其*解引用就是得到了整个数组printf("%d\n",sizeof(&a+1));// 4/8 跳过一整块数组后的地址printf("%d\n",sizeof(&a[0]));// 4/8 首元素的地址printf("%d\n",sizeof(&a[0]+1));// 4/8 第二个元素的地址//字符数组 char arr[]={'a','b','c','d','e','f'};printf("%d\n",sizeof(arr));// 6 char类型的元素大小为1printf("%d\n",sizeof(arr+0));// 4/8 首元素地址printf("%d\n",sizeof(*arr));// 1 首元素printf("%d\n",sizeof(arr[1]));// 1 第二个元素printf("%d\n",sizeof(&arr));// 4/8 整个数组的地址printf("%d\n",sizeof(&arr+1));//4/8 跳过整个数组后的第一个地址printf("%d\n",sizeof(&arr[0]+1));// 4/8 第二个元素的地址//strlen 是通过地址寻找地址对应元素的\0来使自己暂停增加的原码对应:             //size_t strlen(const char* arr) //(Tips:size_t就是编译器自己定义的unsigned long int)没啥特别的。//下列的随机值的大小相同printf("%d\n",strlen(arr));// 随机值 具体要看在哪遇见\0printf("%d\n",strlen(arr+0));//随机值 printf("%d\n",strlen(*arr));//报错,此写法为错误写法printf("%d\n",strlen(arr[1]));//报错printf("%d\n",strlen(&arr));//随机值 printf("%d\n",strlen(&arr+1));//随机值-6printf("%d\n",strlen(&arr[0]+1));//随机值-1------------------------(快乐分界线)--------------------------------------char arr[]="abcdef";//字符串和字符数组几乎没有区别除了在末尾多了个\0printf("%d\n",sizeof(arr));//7 六个元素加上\0printf("%d\n",sizeof(arr+0));//4/8 首元素地址的大小printf("%d\n",sizeof(*arr));//1 首元素大小printf("%d\n",sizeof(arr[1]));//1 第二个元素的大小printf("%d\n",sizeof(&arr));//4/8 首元素地址的大小printf("%d\n",sizeof(&arr+1));//4/8 数组后第一个地址的大小printf("%d\n",sizeof(&arr[0]+1));//4/8 第二个地址的大小printf("%d\n",strlen(arr));//6 正常用法printf("%d\n",strlen(arr+0));//6 传的地址相同printf("%d\n",strlen(*arr));//报错 传的是首元素对应ASCII值printf("%d\n",strlen(arr[1]));//报错第二个元素的ASCII值printf("%d\n",strlen(&arr));//6&arr 和arr数值上相同printf("%d\n",strlen(&arr+1));//随机值printf("%d\n",strlen(&arr[0]+1));// 5传的是第二个元素的地址char*p ="abcdef";//指针和数组的字符串的区别有 &p 和&arr不是一个类型 而且在sizeof中也有不同printf("%d\n",sizeof(p));// 4/8 p为地址printf("%d\n",sizeof(p+1));// 4/8 第二个元素地址的大小printf("%d\n",sizeof(*p));// 1 char类型1个字节大printf("%d\n",sizeof(p[0]));// 1 char 类型1个字节大 p[0]-->*(p+0)printf("%d\n",sizeof(&p));// 4/8 存放p指针变量的地址printf("%d\n",sizeof(&p+1));// 4/8 p地址后的地址 注意:跳了四个字节printf("%d\n",sizeof(&p[0]+1));//4/8 第二个元素的地址printf("%d\n",strlen(p));//6对应strlen 的参数为指针就可理解printf("%d\n",strlen(p+1));//5 从第二个元素的地址开始 注意:&p+1跳四个字节 p+1跳 //的字节与p的类型有关printf("%d\n",strlen(*p));//报错printf("%d\n",strlen(p[0]));//报错printf("%d\n",strlen(&p));//随机值printf("%d\n",strlen(&p+1));//随机值 两个随机值无关printf("%d\n",strlen(&p[0]+1));//5

------------------------(快乐分界线)--------------------------------------
在这里插入图片描述

二维数组练习

//二维数组//二维数组与一维数组相类似在储存上都是连续的//二维数组的每一行都可以当一维数组int a[3][4]={0};printf("%d\n",sizeof(a));// 48 4*4*3 printf("%d\n",sizeof(a[0][0]));// 4 第一行第一个元素printf("%d\n",sizeof(a[0]));// 16 a[0]是一个内存但是把它放在sizeof中就可以把它理 //解成第一行元素的一维数组//前提条件是将它单独放在sizeof内printf("%d\n",sizeof(a[0]+1));// 4/8 a[0]本就是内存+1后不再单独放在sizeof里就不 //可以看做一维数组了a[0]+1指向第一行的第二个元素//相当于&a[0][1];printf("%d\n",sizeof(*(a[0]+1)));// 4 int类型相当于a[0][1];printf("%d\n",sizeof(*(a+1)));// 4 int 类型相当于a[0][1];printf("%d\n",sizeof(&a[0]+1));// 4/8 内存相当于&a[1][0]printf("%d\n",sizeof(*(&a[0]+1)));//4 int类型a[1][0] &a[0]就相当于取出第一行地 //址一跳就跳一行 printf("%d\n",sizeof(*a));// 4 int类型a[0][0]printf("%d\n",sizeof(a[3]));// 16 虽然a[3]没有被定义(我们的数组就只有0 1 2行)但是 //在sizeof里是不会对数组进行访问的他只看数组的类型我们 //a[3]的类型是 int [4] 在sizeof看来就是4*4=16.

与我认知有些偏差的:

printf("%d\n",sizeof(a+0));//4/8没有只包含数组名他就是第一个元素的地址所以是4/8 //看是64位还是32位printf("%d\n",sizeof(*&a));//&a得到的数组的元素地址对其*解引用就是得到了整个数组printf("%d\n",sizeof(&a));//4/8 虽然是数组的地址但依旧只是一个地址//strlen 是通过地址寻找地址对应元素的\0来使自己暂停增加的原码对应:             //size_t strlen(const char* arr) //(Tips:size_t就是编译器自己定义的unsigned long int)没啥特别的。printf("%d\n",strlen(*arr));//报错,此写法为错误写法printf("%d\n",strlen(arr[1]));//报错 因为strlen需要的参数是地址printf("%d\n",sizeof(p));// 4/8 p为地址//二维数组printf("%d\n",sizeof(a[0]));// 16 a[0]是一个内存但是把它放在sizeof中就可以把它理 //解成第一行元素的一维数组//前提条件是将它单独放在sizeof内printf("%d\n",sizeof(a[3]));// 16 虽然a[3]没有被定义(我们的数组就只有0 1 2行)但是 //在sizeof里是不会对数组进行访问的他只看数组的类型我们 //a[3]的类型是 int [4] 在sizeof看来就是4*4=16.
printf("%d\n",sizeof(a[3]));

我们在使用sizeof(4+1)是sizeof也会返回值时4因为
他是整形类型.

结束

我现在是先记笔记然后粘贴到CSDN上最后进行一些小优化就上传了可能有地方没有照顾到希望大家斧正

标签: c语言 算法

本文转载自: https://blog.csdn.net/qq_61434711/article/details/122277676
版权归原作者 就一个挺垃圾的跑路人 所有, 如有侵权,请联系我们删除。

“指针进阶(二) (跑路人笔记)”的评论:

还没有评论