江西住房和城乡建设厅网站阿里云服务器做网站好用吗
江西住房和城乡建设厅网站,阿里云服务器做网站好用吗,专业企业网站建设定制,昆明app开发哪家好strlne函数的使用 一.strlen函数的声明二.strlen函数的头文件三.相关题目代码1代码2题目1题目2题目3题目4题目5题目6 一.strlen函数的声明
size_t strlen ( const char * str );二.strlen函数的头文件
使用strlen函数我们需要使用以下头文件
#include string.h三.相… strlne函数的使用 一.strlen函数的声明二.strlen函数的头文件三.相关题目代码1代码2题目1题目2题目3题目4题目5题目6 一.strlen函数的声明
size_t strlen ( const char * str );二.strlen函数的头文件
使用strlen函数我们需要使用以下头文件
#include string.h三.相关题目
下面我们来看几段代码
代码1
int main()
{const char* p abcdefghi;printf(%lld\n, strlen(p));printf(%lld\n, strlen(p 1));printf(%lld\n, strlen(p[0]));printf(%lld\n, strlen(p));printf(%lld\n, strlen(p 1));printf(%lld\n, strlen(p[0] 1));return 0;
}首先我们先看运行结果 首先解释strlen(p字符串中有’\0’,而p中存放的是a的地址所以值就是9 strlen(p 1)是第一个字符的地址1就是第二个字符b所以就是8 strlen(*p)把a的值传给strlen所以错误 strlen(p[0]):*p *(p0) p[0]错误 strlen(p)p是p的地址从p所占的空间位置开始查找所以是随机值 strlen(p 1)p是p的地址p 1是p的地址1所以是随机值 strlen(p[0] 1)p[0]是第一个元素的地址就是a向后面找到’\0’前就是8 代码2
int main()
{int a[3][4] { 0 };printf(%d\n, sizeof(a));printf(%d\n, sizeof(a[0][0]));printf(%d\n, sizeof(a[0]));printf(%d\n, sizeof(a[0] 1));printf(%d\n, sizeof(*(a[0] 1)));printf(%d\n, sizeof(a 1));printf(%d\n, sizeof(*(a 1)));printf(%d\n, sizeof(a[1]));printf(%d\n, sizeof(a[0] 1));printf(%d\n, sizeof(*(a[0] 1)));printf(%d\n, sizeof(*a));printf(%d\n, sizeof(a[3]));return 0;
}首先看运行结果
这里解释上面代码 sizeof(a):计算的是整个二维数组地址的大小一共有十二个元素每个元素是整型占用4个字节的内存所以结果就是48 sizeof(a[0][0])a[0][0]是第一行的第一个元素大小是4个字节 sizeof(a[0])a[0]就是第一行的大小第一行·的数组名单独放在sizeof内部计算的就是第一行的元素大小就是16sizeof操作符在之前的博客中也有介绍感兴趣的小伙伴可以点击主页了解 sizeof(a[0] 1)a[0]是第一行数组的数组名但是数组名不是单独放在sizeof内部所以数组名表示首元素的地址也就是a[0][0]的地址a[0]1就是第一行第二个元素a[0][1]的地址地址的大小就是4或者8个字节 sizeof(*(a[0] 1)):a[0] 1是第一行第二个元素a[0][1]的地址,(a[0] 1)就是第一行第二个元素大小是4个字节 sizeof(a 1)a没有单独放在sizeof内部。1就是第一行的地址第一行有4个元素所以大小是16个字节 sizeof(a[1])等价于sizeof(a1)也是第一行的地址16个字节 sizeof(a[0] 1):a[0]是第一行的地址a[0] 1就是第二行的地址4或者8个字节 sizeof(*(a[0] 1)):a[0] 1就是第二行的地址第二行有4个元素所以就是16个字节 sizeof(*a)数组名a就是数组首元素地址就是第一行的地址*a就是第一行的地址*a *(a0) a[0]所以就是16个字节 sizeof(a[3])是第四行的地址所以就是16个字节 题目1 int main()
{int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(a 1);printf(%d, %d, *(a 1), *(ptr - 1));return 0;
}首先看一下运行结果 这里解释(int*)(a 1)a是数组的地址在1就是跳过整个数组 *(a 1):a是首元素地址1就是第二个元素地址在解引用就是2 *(ptr - 1):ptr是数组的地址在-1就是第五个元素就是5 题目2 在X86环境下 假设结构体的⼤⼩是20个字节 程序输出的结构是啥 指针运算中的指针±整数 struct Test
{int Num;char* pcName;short sDate;char cha[2];short sBa[4];
} * p (struct Test*)0x100000;int main()
{printf(%p\n, p 0x1);printf(%p\n, (unsigned long)p 0x1);printf(%p\n, (unsigned int*)p 0x1);return 0;
}p 0x10x1是十六进制里面的1十六进制的1和十进制里的1是一样的所以就是0x00100014 unsigned long:是整型整形加减就是整型所以就是1结果就是0x00100001 (unsigned int*)p:是整型指针整型指针1就是4个字节所以结果就是0x00100004 题目3
int main()
{int a[3][2] { (0, 1), (2, 3), (4, 5)}; int* p;p a[0];printf(%d, p[0]);return 0;
}int a[3][2] { (0, 1), (2, 3), (4, 5)}; :数组内是逗号表达式所以值是135 此时数组内的元素就是 p[0]:等价于*(p0)就是第一个元素就是1 下面是运行结果
题目4 假设环境是x86环境程序输出的结果是啥 int main()
{int a[5][5];int(*p)[4];p a;printf(%p,%d\n, p[4][2] - a[4][2], p[4][2] - a[4][2]);return 0;
} p[4][2]和a[4][2]之间相差4个元素但是p[4][2]是小地址a[4][2]是大地址所以结果是复数如下图 printf(%p,%d\n, p[4][2] - a[4][2], p[4][2] - a[4][2]); :这段代码第一是以%p的方式打印-4要存在内存当中存的是补码地址没有原反补的概念所以直接打印F F F F F F F C但是以%d的方式打印存的就是源码 -4的 源码10000000 00000000 00000000 00000100 反码111111111 111111111 111111111 11111101 补码111111111 111111111 111111111 11111110 换成十六进制就是 F F F F F F F C 运行结果
题目5
int main()
{int aa[2][5] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int* ptr1 (int*)(aa 1);int* ptr2 (int*)(*(aa 1));printf(%d,%d, *(ptr1 - 1), *(ptr2 - 1));//10 5return 0;
}aa 1aa是数组名数组名1就是跳过整个数组所以*(ptr1 - 1)就是10如下图 *(aa 1):aa是数组首元素地址1就是第二行地址*(aa1)等价于aa[1],就是5如下图 下面代码的运行结果是 题目6
int main()
{const char* a[] { work,at,alibaba };const char** pa a;pa;printf(%s\n, *pa);return 0;
}a是首元素地址所以pa就是第一个元素地址 pa就是第二个元素地址在解引用拿到第二个元素如下图
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/87959.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!