指针进阶 (跑路人笔记)
Posted 就一个挺垃圾的跑路人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针进阶 (跑路人笔记)相关的知识,希望对你有一定的参考价值。
前言
咳咳,本文是关于之前知识点的一些小练习可以巩固一下基础废话不多讲直接开始。本文的小练习我直接以代码块加注释解决了,望大家体谅。下次加上了之前没讲到的知识点和例子。
大家期待一下(三)很快估计明天就出了。
练习
//一维数组 int a[] = 1,2,3,4;
printf("%d\\n",sizeof(a)); //16 sizeof内包含且只包含数组名就是算他所有元素的
//字节大小相当于&a
printf("%d\\n",sizeof(a+0));//4/8没有只包含数组名他就是第一个元素的地址所以是4/8
//看是64位还是32位
printf("%d\\n",sizeof(*a)); // 4 对字符名解引用就是首元素类型是int 所以答案是4
printf("%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类型的元素大小为1
printf("%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)); // 随机值 具体要看在哪遇见\\0
printf("%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));//随机值-6
printf("%d\\n", strlen(&arr[0]+1));//随机值-1
------------------------(快乐分界线)--------------------------------------
char arr[] = "abcdef";//字符串和字符数组几乎没有区别除了在末尾多了个\\0
printf("%d\\n", sizeof(arr));//7 六个元素加上\\0
printf("%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上最后进行一些小优化就上传了可能有地方没有照顾到希望大家斧正
以上是关于指针进阶 (跑路人笔记)的主要内容,如果未能解决你的问题,请参考以下文章