admin管理员组文章数量:1034115
C语言 —— 此去经年梦浪荡魂音
1. sizeof 和 strlen的区别
1.1 sizeof
sizeof 计算变量所占内存内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小 sizeof 只关注占⽤内存空间的大小,不在乎内存中存放什么数据
sizeof是操作符 |
---|
sizeof计算操作数所占内存的⼤⼩,单位是字节 |
不关注内存中存放什么数据 |
#include <stdio.h>
int main()
{
int a = 10;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof a);
printf("%d\n", sizeof(int));
return 0;
}
1.2 strlen
strlen文档链接: strlen - C++ Reference
/?kw=strlen
strlen是库函数,使⽤需要包含头⽂件 string.h |
---|
srtlen是求字符串⻓度的,统计的是 \0 之前字符的隔个数 |
关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界 |
代码语言:javascript代码运行次数:0运行复制strlen 是C语言库函数,功能是求字符串长度。函数原型如下:
size_t strlen ( const char * str );
代码语言:javascript代码运行次数:0运行复制统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数,strlen 函数会⼀直向后找 \0 字符,直到找到为⽌,所以可能存在越界查找
#include <stdio.h>
int main()
{
char arr1[3] = {'a', 'b', 'c'};
char arr2[] = "abc";
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));
printf("%d\n", sizeof(arr1));
printf("%d\n", sizeof(arr2));
return 0;
}
这里strlen(arr1)就是没有\0所以就越界查找,产生了随机值35
如果字符串中间就有一个\0,那么就以这个\0为基准
2. 数组和指针习题解析
2.1 一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a+0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(a[1]));
printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(*&a));
printf("%d\n",sizeof(&a+1));
printf("%d\n",sizeof(&a[0]));
printf("%d\n",sizeof(&a[0]+1));
X86和X64环境下运行结果:
代码解析:
2.2 字符数组
注意:
代码1:
代码语言:javascript代码运行次数:0运行复制char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
X86和X64环境下运行结果:
代码解析:
代码2:
代码语言:javascript代码运行次数:0运行复制char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));
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));
printf("%d\n", strlen(&arr[0]+1));
X86和X64环境下运行结果:
代码解析:
代码3:
代码语言:javascript代码运行次数:0运行复制char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
X86和X64环境下运行结果:
代码解析:
代码4:
代码语言:javascript代码运行次数:0运行复制char arr[] = "abcdef";
printf("%d\n", strlen(arr));
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));
printf("%d\n", strlen(&arr[0]+1));
X86和X64环境下运行结果:
代码解析:
代码5:
代码语言:javascript代码运行次数:0运行复制char *p = "abcdef";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));
X86和X64环境下运行结果:
代码解析:
代码6:
代码语言:javascript代码运行次数:0运行复制char *p = "abcdef";
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));
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));
X86和X64环境下运行结果:
代码解析:
2.3 二维数组
代码语言:javascript代码运行次数:0运行复制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[0]+1));
printf("%d\n",sizeof(*(&a[0]+1)));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3]));
X86和X64环境下运行结果:
代码解析:
数组名的意义: 1. sizeof(数组名),这⾥的数组名表⽰整个数组,计算的是整个数组的大小 2. &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址 3. 除此之外所有的数组名都表示首元素的地址
3. 指针运算笔试题解析
3.1
代码语言:javascript代码运行次数:0运行复制#include <stdio.h>
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf( "%d,%d", *(a + 1), *(ptr - 1));
return 0;
}
3.1
代码语言:javascript代码运行次数:0运行复制在X86环境下假设结构体的大小是20个字节程序输出的结构是什么
struct Test
{
int Num;
char* pcName;
short sDate;
char cha[2];
short sBa[4];
}*p = (struct Test*)0x100000;
//定义了一个指向 Test 结构体的指针 p,并将其初始化为内存地址 0x100000
int main()
{
printf("%p\n", p + 0x1);
printf("%p\n", (unsigned long)p + 0x1);
printf("%p\n", (unsigned int*)p + 0x1);
return 0;
}
运行结果:
题目解析:
3.3
代码语言:javascript代码运行次数:0运行复制#include <stdio.h>
int main()
{
int a[3][2] = { (0, 1), (2, 3), (4, 5) };
int* p;
p = a[0];
printf("%d", p[0]);
return 0;
}
a[0] 指向二维数组 a 第一行,这里将 a[0] 赋值给指针 p,此时 p 就指向了数组 a 的第一行的第一个元素,也就是值为 1 的那个元素
3.4
代码语言:javascript代码运行次数:0运行复制//假设环境是x86环境,程序输出的结果是啥?
#include <stdio.h>
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;
}
3.5
代码语言:javascript代码运行次数:0运行复制#include <stdio.h>
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));
return 0;
}
3.6
代码语言:javascript代码运行次数:0运行复制#include <stdio.h>
int main()
{
char* a[] = { "work","at","alibaba" };
char** pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}
3.7
运算符优先级博客链接: C语言 —— 愿此世如黄金般辉煌 - 进制转换与操作符详解-CSDN博客
.2014.3001.5501
代码语言:javascript代码运行次数:0运行复制#include <stdio.h>
int main()
{
char* c[] = { "ENTER","NEW","POINT","FIRST" };
char** cp[] = { c + 3,c + 2,c + 1,c };
char*** cpp = cp;
printf("%s\n", **++cpp);
printf("%s\n", *-- * ++cpp + 3);
printf("%s\n", *cpp[-2] + 3);
printf("%s\n", cpp[-1][-1] + 1);
return 0;
}
p1
代码语言:javascript代码运行次数:0运行复制printf("%s\n", **++cpp);
++cpp 会使 cpp 指针自增,指向 cp +1的位置,也就是数组中的第二个元素,*cpp 得到c+2,c + 2 的指针指向字符串 POINT,然后再次*得到POINT
p2
代码语言:javascript代码运行次数:0运行复制printf("%s\n", *-- * ++cpp + 3);
p3
代码语言:javascript代码运行次数:0运行复制printf("%s\n", *cpp[-2] + 3);
p4
代码语言:javascript代码运行次数:0运行复制printf("%s\n", cpp[-1][-1] + 1);
完结撒花~
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-03-27,如有侵权请联系 cloudcommunity@tencent 删除字符串sizeof内存数组指针C语言 —— 此去经年梦浪荡魂音
1. sizeof 和 strlen的区别
1.1 sizeof
sizeof 计算变量所占内存内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小 sizeof 只关注占⽤内存空间的大小,不在乎内存中存放什么数据
sizeof是操作符 |
---|
sizeof计算操作数所占内存的⼤⼩,单位是字节 |
不关注内存中存放什么数据 |
#include <stdio.h>
int main()
{
int a = 10;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof a);
printf("%d\n", sizeof(int));
return 0;
}
1.2 strlen
strlen文档链接: strlen - C++ Reference
/?kw=strlen
strlen是库函数,使⽤需要包含头⽂件 string.h |
---|
srtlen是求字符串⻓度的,统计的是 \0 之前字符的隔个数 |
关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界 |
代码语言:javascript代码运行次数:0运行复制strlen 是C语言库函数,功能是求字符串长度。函数原型如下:
size_t strlen ( const char * str );
代码语言:javascript代码运行次数:0运行复制统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数,strlen 函数会⼀直向后找 \0 字符,直到找到为⽌,所以可能存在越界查找
#include <stdio.h>
int main()
{
char arr1[3] = {'a', 'b', 'c'};
char arr2[] = "abc";
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));
printf("%d\n", sizeof(arr1));
printf("%d\n", sizeof(arr2));
return 0;
}
这里strlen(arr1)就是没有\0所以就越界查找,产生了随机值35
如果字符串中间就有一个\0,那么就以这个\0为基准
2. 数组和指针习题解析
2.1 一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a+0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(a[1]));
printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(*&a));
printf("%d\n",sizeof(&a+1));
printf("%d\n",sizeof(&a[0]));
printf("%d\n",sizeof(&a[0]+1));
X86和X64环境下运行结果:
代码解析:
2.2 字符数组
注意:
代码1:
代码语言:javascript代码运行次数:0运行复制char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
X86和X64环境下运行结果:
代码解析:
代码2:
代码语言:javascript代码运行次数:0运行复制char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));
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));
printf("%d\n", strlen(&arr[0]+1));
X86和X64环境下运行结果:
代码解析:
代码3:
代码语言:javascript代码运行次数:0运行复制char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
X86和X64环境下运行结果:
代码解析:
代码4:
代码语言:javascript代码运行次数:0运行复制char arr[] = "abcdef";
printf("%d\n", strlen(arr));
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));
printf("%d\n", strlen(&arr[0]+1));
X86和X64环境下运行结果:
代码解析:
代码5:
代码语言:javascript代码运行次数:0运行复制char *p = "abcdef";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));
X86和X64环境下运行结果:
代码解析:
代码6:
代码语言:javascript代码运行次数:0运行复制char *p = "abcdef";
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));
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));
X86和X64环境下运行结果:
代码解析:
2.3 二维数组
代码语言:javascript代码运行次数:0运行复制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[0]+1));
printf("%d\n",sizeof(*(&a[0]+1)));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3]));
X86和X64环境下运行结果:
代码解析:
数组名的意义: 1. sizeof(数组名),这⾥的数组名表⽰整个数组,计算的是整个数组的大小 2. &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址 3. 除此之外所有的数组名都表示首元素的地址
3. 指针运算笔试题解析
3.1
代码语言:javascript代码运行次数:0运行复制#include <stdio.h>
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf( "%d,%d", *(a + 1), *(ptr - 1));
return 0;
}
3.1
代码语言:javascript代码运行次数:0运行复制在X86环境下假设结构体的大小是20个字节程序输出的结构是什么
struct Test
{
int Num;
char* pcName;
short sDate;
char cha[2];
short sBa[4];
}*p = (struct Test*)0x100000;
//定义了一个指向 Test 结构体的指针 p,并将其初始化为内存地址 0x100000
int main()
{
printf("%p\n", p + 0x1);
printf("%p\n", (unsigned long)p + 0x1);
printf("%p\n", (unsigned int*)p + 0x1);
return 0;
}
运行结果:
题目解析:
3.3
代码语言:javascript代码运行次数:0运行复制#include <stdio.h>
int main()
{
int a[3][2] = { (0, 1), (2, 3), (4, 5) };
int* p;
p = a[0];
printf("%d", p[0]);
return 0;
}
a[0] 指向二维数组 a 第一行,这里将 a[0] 赋值给指针 p,此时 p 就指向了数组 a 的第一行的第一个元素,也就是值为 1 的那个元素
3.4
代码语言:javascript代码运行次数:0运行复制//假设环境是x86环境,程序输出的结果是啥?
#include <stdio.h>
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;
}
3.5
代码语言:javascript代码运行次数:0运行复制#include <stdio.h>
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));
return 0;
}
3.6
代码语言:javascript代码运行次数:0运行复制#include <stdio.h>
int main()
{
char* a[] = { "work","at","alibaba" };
char** pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}
3.7
运算符优先级博客链接: C语言 —— 愿此世如黄金般辉煌 - 进制转换与操作符详解-CSDN博客
.2014.3001.5501
代码语言:javascript代码运行次数:0运行复制#include <stdio.h>
int main()
{
char* c[] = { "ENTER","NEW","POINT","FIRST" };
char** cp[] = { c + 3,c + 2,c + 1,c };
char*** cpp = cp;
printf("%s\n", **++cpp);
printf("%s\n", *-- * ++cpp + 3);
printf("%s\n", *cpp[-2] + 3);
printf("%s\n", cpp[-1][-1] + 1);
return 0;
}
p1
代码语言:javascript代码运行次数:0运行复制printf("%s\n", **++cpp);
++cpp 会使 cpp 指针自增,指向 cp +1的位置,也就是数组中的第二个元素,*cpp 得到c+2,c + 2 的指针指向字符串 POINT,然后再次*得到POINT
p2
代码语言:javascript代码运行次数:0运行复制printf("%s\n", *-- * ++cpp + 3);
p3
代码语言:javascript代码运行次数:0运行复制printf("%s\n", *cpp[-2] + 3);
p4
代码语言:javascript代码运行次数:0运行复制printf("%s\n", cpp[-1][-1] + 1);
完结撒花~
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-03-27,如有侵权请联系 cloudcommunity@tencent 删除字符串sizeof内存数组指针本文标签: C语言此去经年梦浪荡魂音
版权声明:本文标题:C语言 —— 此去经年梦浪荡魂音 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1748116824a2255874.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论