“全网最细“C语言指针笔试题详解_c语言指针代码笔试题-程序员宅基地

技术标签: 算法  c++  C语言  c语言  

先来点指针与数组结合的题

第一题:

int main()
{
	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));
	return 0;
}

printf("%d\n", sizeof(a));这个语句的意思是sizeof中单独放数组名代表整个数组,一个int占4个字节,4个占16个字节
printf("%d\n", sizeof(a + 0));这个语句的意思是数组名没有单独放在sizeof内部则代表数组首元素地址+0后是第一个元素的地址 地址是4/8个字节
printf("%d\n", sizeof(*a));a代表首元素地址,解引用后是首元素1,,1的大小为4个字节
printf("%d\n", sizeof(a + 1));数组名没有单独放在sizeof内部则代表数组首元素地址+1后是第二个元素的地址 地址是4/8个字节
printf("%d\n", sizeof(a[1]));[]的作用与*(a+1)相同,找到元素2,元素2的大小为4个字节
printf("%d\n", sizeof(&a));&符号+数组名代表整个数组的地址,地址是4/8个字节
printf("%d\n", sizeof(*&a));整个数组的地址解引用代表整个数组,整个数组是16个字节
printf("%d\n", sizeof(&a + 1));整个数组的地址+1跳过一个数组,为下一个数组的地址,地址的大小为4/8字节
printf("%d\n", sizeof(&a[0]));a[0]代表第一个元素,加上&符号表示第一个元素的地址,地址为4/8字节
printf("%d\n", sizeof(&a[0] + 1));第一个元素的地址+1表示指向下一个元素的地址,也就是2的地址,大小为4/8

以下为代码运行结果:

d7caf57c87a4488b973b4206aa4221af.png

第二题:

#include <string.h>

int main()
{
	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));
	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));
	return 0;
}

做这道题前首先要明白char arr[] = { 'a','b','c','d','e','f' };和char arr2[] = "abcdef";的区别,如下图所示:

f7d8e0ec88494996806dedb0acb8ed6b.png 

arr中末尾没有\0,arr2中末尾会有一个\0 ;

printf("%d\n", sizeof(arr));sizeof中单独放数组名代表整个数组,数组中有6个char类型字符,一个占1个字节,一共6字节
printf("%d\n", sizeof(arr+0));sizeof中没有单独放数组名代表首元素地址,+0后为a的地址,地址大小为4/8
printf("%d\n", sizeof(*arr));sizeof中没有单独放数组名代表首元素地址,解引用后代表字符a,大小为1
printf("%d\n", sizeof(arr[1]));arr[1]代表b字符,大小为1;
printf("%d\n", sizeof(&arr));&arr代表整个数组的地址,大小为4/8
printf("%d\n", sizeof(&arr+1));&arr代表整个数组的地址+1后跳过一个数组代表下一个数组的地址,大小为4/8
printf("%d\n", sizeof(&arr[0]+1));arr[0]为第一个元素,加上&符号后代表第一个元素的地址,+1后为第二个元素的地址,大小为4/8
printf("%d\n", strlen(arr));strlen函数是找有无\0,有\0大小就是\0之前的元素个数,没有\0就是随机值
arr代表数组首元素地址,strlen函数从a开始往后寻找\0,发现没有\0后返回随机值
printf("%d\n", strlen(arr+0));arr+0代表第一个元素地址,strlen根据地址找到元素a,往后寻找\0发现没有\0后返回随机值
这里的随机值是指在数组范围内没有找到\0,超出数组规定范围后有可能在任意地方找到\0所以为随机值
printf("%d\n", strlen(*arr));*arr代表第一个元素a,元素a的ascll值为97,返回数字97后编译器报错,因为97的地址不允许被访问
printf("%d\n", strlen(arr[1]));arr[1]代表元素b,元素b的ascll值为98,返回数字98后编译器报错,因为98的地址不允许被访问
printf("%d\n", strlen(&arr));&arr代表整个数组地址,strlen函数从a开始往后寻找\0,发现没有\0后返回随机值
printf("%d\n", strlen(&arr+1));&arr+1代表下一个数组的地址,下一个数组的地址往后什么时候找到\0并不知道,所以返回随机值
printf("%d\n", strlen(&arr[0]+1));&arr[0]+1代表第二个元素的地址,从第二个元素依次向后寻找\0没有\0返回随机值

第三题:

int main()
{
	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));

	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));
	return 0;
}

printf("%d\n", sizeof(arr));sizeof中单独放数组名代表整个数组,除abcdef外还有\0占据一个字节所以一共7个字节
printf("%d\n", sizeof(arr + 0));arr+0代表首元素地址,地址大小为4/8
printf("%d\n", sizeof(*arr));*arr代表首元素a,大小为1
printf("%d\n", sizeof(arr[1]));arr[1]代表元素b,大小为1
printf("%d\n", sizeof(&arr));&arr代表整个数组的地址,大小为4/8
printf("%d\n", sizeof(&arr + 1));&arr+1代表下一个数组的地址,大小为4/8
printf("%d\n", sizeof(&arr[0] + 1));&arr[0]+1代表第二个元素b的地址,大小为4/8

printf("%d\n", strlen(arr));除了sizeof(arr)和&arr为整个数组其他数组名都为首元素地址,由a的地址找到a往后找\0,而f后就是\0,所以长度为\0之前的 长度为6
printf("%d\n", strlen(arr + 0));arr+0是首元素的地址长度为6
printf("%d\n", strlen(*arr));*arr为首元素a,返回a的ascll值为地址为97的空间,编译器会报错
printf("%d\n", strlen(arr[1]));arr[1]代表元素b,返回b的ascll值为地址为98的空间,编译器会报错
printf("%d\n", strlen(&arr));整个数组的地址也是从首元素开始,所以从a开始向后寻找\0长度为6
printf("%d\n", strlen(&arr + 1));&arr+1为下一个数组的地址,下一个数组不知道什么时候有\0所以为随机值
printf("%d\n", strlen(&arr[0] + 1));&arr[0]+1为数组b的地址,长度为5

第四题:

int main()
{
	const 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));

	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));
	return 0;
}

printf("%d\n", sizeof(p));p指针存放字符串首元素a的地址,通过a的地址可找到整个字符串p是指针,指针的大小为4/8
printf("%d\n", sizeof(p + 1));指针+1向后访问下一个同类型元素地址,大小为4/8
printf("%d\n", sizeof(*p));p指针存放字符串首元素a的地址,*p为首元素a,大小为1
printf("%d\n", sizeof(p[0]));p[0]和*(p+0)相等为第一个元素 大小为1
printf("%d\n", sizeof(&p));&p为二级指针,存放的是a的地址,大小为4/8
printf("%d\n", sizeof(&p + 1));&p+1也是二级指针,二级指针在内存中也有自己的空间,p+1跳过一个二级指针大小找到&p的后一块地址这个地址并没有指向哪个位置,只有&p指向的是存放a地址的空间,只要是地址大小都为4/8
printf("%d\n", sizeof(&p[0] + 1));p[0]为字符a,&p[0]为a的地址,+1后跳过一个char类型的地址为b元素的地址,大小为4/8

printf("%d\n", strlen(p));p中存放a的地址strlen找到字符a后向后寻找\0,\0在f后面所以长度为6
printf("%d\n", strlen(p + 1));p+1为b的地址,长度为5
printf("%d\n", strlen(*p));*p为字符a,返回a的ascll值为97,编译器报错
printf("%d\n", strlen(p[0]));p[0]为字符a,返回a的ascll值为97,编译器报错
printf("%d\n", strlen(&p));&p为存放a的地址的二级指针,二级指针在内存有自己的空间,空间里放的是地址如0x12345678,向后寻找\0并不知道\0在哪里所以是随机值
printf("%d\n", strlen(&p + 1));&p为存放a的地址的二级指针,二级指针+1为指向下一个二级指针的地址,向后寻找\0并不知道什么时候有\0所以是随机值
printf("%d\n", strlen(&p[0] + 1));p[0]为字符a,&p[0]为a的地址,+1后为b的地址,长度为5

第五题:

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[0]+1));
	printf("%d\n", sizeof*((&a[0] + 1)));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(a[3]));
	return 0;
}

printf("%d\n", sizeof(a));a单独放在sizeof中代表整个数组,整个数组大小为3*4*4==48
printf("%d\n", sizeof(a[0][0]));a[0][0]代表数组第一个元素 大小为4
printf("%d\n", sizeof(a[0]));a[0]是第一行,第一行是一个一维数组,a[0]是数组名代表整个数组大小为4*4==16
printf("%d\n", sizeof(a[0] + 1));a[0]并没有单独放在sizeof内部所以a[0]为第一行首元素地址,+1后代表第一行第二个元素地址大小4/8
printf("%d\n", sizeof(*(a[0] + 1)));a[0]并没有单独放在sizeof内部所以a[0]为第一行首元素地址,+1后代表第一行第二个元素地址,解引用后为第一行第二个元素,大小为4
printf("%d\n", sizeof(a + 1));a没有单独放在sizeof内部,a代表数组首元素地址,数组首元素为第一行,第一行的地址+1跳过一行指向第二行的地址,地址大小为4/8
printf("%d\n", sizeof(*(a + 1)));第二行解引用后为第二行所有元素,大小为16
printf("%d\n", sizeof(&a[0] + 1));&a[0]代表第一行整个数组的地址,+1后跳到下一个数组也就是第二行数组的地址,地址的大小为4/8
printf("%d\n", sizeof* ((&a[0] + 1)));对第二行整个数组解引用后大小为16
printf("%d\n", sizeof(*a));a代表第一行的地址,解引用后为第一行所有元素,大小为16
printf("%d\n", sizeof(a[3]));a[3]为第四行所有元素,大小为16,即使数组只有三行,但sizeof关键字只是预判括号内的大小并不会进行实际运算

第六题:

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* ptr = (int*)(&a + 1); &a代表整个数组+1后指向下一个数组,将其强制转化为int*类型则每次跳过一个(int*)大小的地址

*(a + 1):a为首元素地址也就是1的地址+1后为2的地址,解引用后就是2

*(ptr - 1)):ptr指向下一个数组起始位置,-1后指向a数组的元素5的地址,解引用后为元素5,以下为示意图:

22469d89ecab4b279b1311e2e4f4230b.png

第七题:

struct Test
{
	int num;
	char* pcname;
	short sdate;
	char a[2];
	short sa[4];
}*p;

int main()
{
	printf("%p\n", p + 0x1);
	printf("%p\n", (unsigned long)p+0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
	return 0;
}

 做这题前我们先计算结构体大小:

a5df057048ff44a5bcc5fcb3f8ef66d0.png

图中由于位置不够18下面少画了一个空间格子,图中已标出最后浪费2个空间凑够20个空间为最大对齐数4的倍数,所以结构体大小为20. 

printf("%p\n", p + 0x1);p是一个结构体指针,0x1就是1,指针+1就是跳过同指针类型的大小,指针类型为结构体大小为20,,地址变为0x100014

printf("%p\n", (unsigned long)p+0x1);将p强制转化为无符号整形,这时候p+1就是跳过一个整形1,地址变为0x100001

printf("%p\n", (unsigned int*)p + 0x1);将p强制转化为int*指针类型,p+1跳过一个指针类型也就是地址加4或8,所以地址为0x100004

第八题:

int main()
{
	int a[4] = { 1,2,3,4 };
	int* ptr1 = (int*)(&a + 1);
	int* ptr2 = (int*)((int)a + 1);
	printf("%x,%x", ptr1[-1], *ptr2);
	return 0;
}

int* ptr1 = (int*)(&a + 1);&a+1指针指向下一个数组起始位置,将其强制转化为int*后相当于每次+1-1跳过一个int*类型大小的空间

int* ptr2 = (int*)((int)a + 1);a为1的地址将其强制转化为int类型后+1只跳过1个字节,然后将其强制转化为(int*)表示大小取int*类型的大小

如图所示:

03e31301579d42e3b0b4de8188789b64.png

ptr1[-1]为*(ptr1-1) 也就是指向4的地址解引用为元素4

*ptr2指向00字节位置,此位置也有可能为02这要看编译器是大端存放还是小端存放但都不影响结果,往后拿int*类型大小的空间就是02000000,所以地址为2000000

第九题:

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] = {1,3,5};

2beef54483ee4b62aee56234897ee0ea.png

a[0]代表数组第一行第一个元素的地址,将地址给p后p指向1的地址,所以p[0]为1

第十题:

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;
}

int(*p)[4]; p是一个数组指针,数组指针里每个指针只能放4个元素

ec6732d48df94e47a923b1a2694da60c.png

两个指针相减为指针之间的元素个数,由图可知两个指针之间有4个元素,而用地址小的指针减去地址大的指针为负数所以是-4,打印地址的时候要将-4的补码进行打印,-4的补码为11111111111111111111111111111100转化为16进制为FF FF FF FC 

第十一题:

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;
}

int* ptr1 = (int*)(&aa + 1);&aa为整个数组+1后指向下一个数组起始位置

int* ptr2 = (int*)(*(aa + 1));aa为第一行的地址,aa+1为第二行的地址,指针指向第二行起始位置

41f6305567614c9ab047c4cb7d9e1a3a.png

如图所示ptr1-1为10的地址解引用后为10,ptr2-1为第一行最后一个元素5的地址,解引用后为元素5 所以答案为10 5。

第十二题:

int main()
{
	const char* a[] = { "work","at","alibaba" };
	const char** pa = a;
	pa++;
	printf("%s\n", *pa);
	return 0;
}

const char* a[] = { "work","at","alibaba" }; a数组为char*类型,存放三个字符串。

const char** pa = a;将a的地址给二级指针pa存储

650bbb4b16734fb592f9973b39d87d6e.png

如图所示pa与a一样都指向第一个字符串work中w的地址, a中每个字符串都是char*类型,需要用二级指针接收,pa++后指针指向at中首元素a的地址然后解引用%s形式打印出at

第十三题:

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;
}

char* c[] = { "ENTER","NEW","POINT","FIRST" };c数组有4个char*类型字符串

char** cp[] = { c + 3,c + 2,c + 1,c };二级指针数组cp中c+3存放FIRST的地址,c+2中存放POINT的地址,c+1中存放NEW的地址,c中存放ENTER的地址。

char*** cpp = cp;三级指针cpp存放二级指针数组中首元素地址也就是指向c+。

 printf("%s\n", **++cpp);cpp指针先自加,自加后指针指向c+2,然后解引用拿到C+2,而c+2中存放的C[2]的地址,c[2]的地址解引用拿到了字符串POINT中p的地址,由P的地址就可以打印整个字符串POINT   如图所示:(图中由cpp指向c+3的线应该删去,原因是cpp的指向发生改变)

95144c324b9c46bcb77f76c5ba007dda.png

printf("%s\n", *--*++cpp+3);cpp指针先自加指向 c+1,然后解引用拿到c+1的内容,而c+1中存放的是c[1]的地址,然后指针自减指向c[0],c[0]解引用后拿到ENTER中E的地址,然后+3指向ER中E的地址,由E的地址打印出ER  如图所示:

75753409b9684925b04a3fc3860707ea.png

printf("%s\n", *cpp[-2] + 3);cpp[-2]与*(cpp-2 )相同,cpp减2指向c+3然后解引用拿到c+3的内容,而c+3的内容是c[3]的地址,然后解引用拿到了c[3]中存放的FIRST字符串中首元素F的地址,+3后为ST中S的地址,通过S的地址打印出ST。(注意这里的cpp指针并没有自加自减或者赋值所以cpp原来的指向不改变还是指向c+1) 如图所示:

677bbb3d41e74cbb851e4de61aca7e89.png

printf("%s\n", cpp[-1][-1] + 1);cpp-1指向c+2,然后解引用找到其内容,c+2的内容是c[2]的地址,然后-1指向c[1]的地址然后解引用找到c[1]的内容也就是字符串NEW中N的地址,+1后指向EW中E的地址,通过E的地址打印出EW。如图所示:

6b6939d81b2542b1a2b54b3a83004724.png 

 同样,cpp指针并没有自加自减或者赋值所以cpp原来的指向不改变还是指向c+1。以上就是C语言指针的笔试题讲解,在这里总结一下:

1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。

2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。

3.除此之外所有的数组名都表示首元素的地址。

4.p[i]和*(p+i)一样。  p[i][j]和*(*(p+i)+j)一样

5.指针+1-1跳过的是一个指针类型,例 int*p  p+1后指针往后跳过一个整形指向下一个整形

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Sxy_wspsby/article/details/127149211

智能推荐

艾美捷Epigentek DNA样品的超声能量处理方案-程序员宅基地

文章浏览阅读15次。空化气泡的大小和相应的空化能量可以通过调整完全标度的振幅水平来操纵和数字控制。通过强调超声技术中的更高通量处理和防止样品污染,Epigentek EpiSonic超声仪可以轻松集成到现有的实验室工作流程中,并且特别适合与表观遗传学和下一代应用的兼容性。Epigentek的EpiSonic已成为一种有效的剪切设备,用于在染色质免疫沉淀技术中制备染色质样品,以及用于下一代测序平台的DNA文库制备。该装置的经济性及其多重样品的能力使其成为每个实验室拥有的经济高效的工具,而不仅仅是核心设施。

11、合宙Air模块Luat开发:通过http协议获取天气信息_合宙获取天气-程序员宅基地

文章浏览阅读4.2k次,点赞3次,收藏14次。目录点击这里查看所有博文  本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持)。  先不管支不支持,如果你用的是合宙的模块,那都不妨一试,也许会有意外收获。  我使用的是Air720SL模块,如果在其他模块上不能用,那就是底层core固件暂时还没有支持,这里的代码是没有问题的。例程仅供参考!..._合宙获取天气

EasyMesh和802.11s对比-程序员宅基地

文章浏览阅读7.7k次,点赞2次,收藏41次。1 关于meshMesh的意思是网状物,以前读书的时候,在自动化领域有传感器自组网,zigbee、蓝牙等无线方式实现各个网络节点消息通信,通过各种算法,保证整个网络中所有节点信息能经过多跳最终传递到目的地,用于数据采集。十多年过去了,在无线路由器领域又把这个mesh概念翻炒了一下,各大品牌都推出了mesh路由器,大多数是3个为一组,实现在面积较大的住宅里,增强wifi覆盖范围,智能在多热点之间切换,提升上网体验。因为节点基本上在3个以内,所以mesh的算法不必太复杂,组网形式比较简单。各厂家都自定义了组_802.11s

线程的几种状态_线程状态-程序员宅基地

文章浏览阅读5.2k次,点赞8次,收藏21次。线程的几种状态_线程状态

stack的常见用法详解_stack函数用法-程序员宅基地

文章浏览阅读4.2w次,点赞124次,收藏688次。stack翻译为栈,是STL中实现的一个后进先出的容器。要使用 stack,应先添加头文件include<stack>,并在头文件下面加上“ using namespacestd;"1. stack的定义其定义的写法和其他STL容器相同, typename可以任意基本数据类型或容器:stack<typename> name;2. stack容器内元素的访问..._stack函数用法

2018.11.16javascript课上随笔(DOM)-程序员宅基地

文章浏览阅读71次。<li> <a href = "“#”>-</a></li><li>子节点:文本节点(回车),元素节点,文本节点。不同节点树:  节点(各种类型节点)childNodes:返回子节点的所有子节点的集合,包含任何类型、元素节点(元素类型节点):child。node.getAttribute(at...

随便推点

layui.extend的一点知识 第三方模块base 路径_layui extend-程序员宅基地

文章浏览阅读3.4k次。//config的设置是全局的layui.config({ base: '/res/js/' //假设这是你存放拓展模块的根目录}).extend({ //设定模块别名 mymod: 'mymod' //如果 mymod.js 是在根目录,也可以不用设定别名 ,mod1: 'admin/mod1' //相对于上述 base 目录的子目录}); //你也可以忽略 base 设定的根目录,直接在 extend 指定路径(主要:该功能为 layui 2.2.0 新增)layui.exten_layui extend

5G云计算:5G网络的分层思想_5g分层结构-程序员宅基地

文章浏览阅读3.2k次,点赞6次,收藏13次。分层思想分层思想分层思想-1分层思想-2分层思想-2OSI七层参考模型物理层和数据链路层物理层数据链路层网络层传输层会话层表示层应用层OSI七层模型的分层结构TCP/IP协议族的组成数据封装过程数据解封装过程PDU设备与层的对应关系各层通信分层思想分层思想-1在现实生活种,我们在喝牛奶时,未必了解他的生产过程,我们所接触的或许只是从超时购买牛奶。分层思想-2平时我们在网络时也未必知道数据的传输过程我们的所考虑的就是可以传就可以,不用管他时怎么传输的分层思想-2将复杂的流程分解为几个功能_5g分层结构

基于二值化图像转GCode的单向扫描实现-程序员宅基地

文章浏览阅读191次。在激光雕刻中,单向扫描(Unidirectional Scanning)是一种雕刻技术,其中激光头只在一个方向上移动,而不是来回移动。这种移动方式主要应用于通过激光逐行扫描图像表面的过程。具体而言,单向扫描的过程通常包括以下步骤:横向移动(X轴): 激光头沿X轴方向移动到图像的一侧。纵向移动(Y轴): 激光头沿Y轴方向开始逐行移动,刻蚀图像表面。这一过程是单向的,即在每一行上激光头只在一个方向上移动。返回横向移动: 一旦一行完成,激光头返回到图像的一侧,准备进行下一行的刻蚀。

算法随笔:强连通分量-程序员宅基地

文章浏览阅读577次。强连通:在有向图G中,如果两个点u和v是互相可达的,即从u出发可以到达v,从v出发也可以到达u,则成u和v是强连通的。强连通分量:如果一个有向图G不是强连通图,那么可以把它分成躲个子图,其中每个子图的内部是强连通的,而且这些子图已经扩展到最大,不能与子图外的任一点强连通,成这样的一个“极大连通”子图是G的一个强连通分量(SCC)。强连通分量的一些性质:(1)一个点必须有出度和入度,才会与其他点强连通。(2)把一个SCC从图中挖掉,不影响其他点的强连通性。_强连通分量

Django(2)|templates模板+静态资源目录static_django templates-程序员宅基地

文章浏览阅读3.9k次,点赞5次,收藏18次。在做web开发,要给用户提供一个页面,页面包括静态页面+数据,两者结合起来就是完整的可视化的页面,django的模板系统支持这种功能,首先需要写一个静态页面,然后通过python的模板语法将数据渲染上去。1.创建一个templates目录2.配置。_django templates

linux下的GPU测试软件,Ubuntu等Linux系统显卡性能测试软件 Unigine 3D-程序员宅基地

文章浏览阅读1.7k次。Ubuntu等Linux系统显卡性能测试软件 Unigine 3DUbuntu Intel显卡驱动安装,请参考:ATI和NVIDIA显卡请在软件和更新中的附加驱动中安装。 这里推荐: 运行后,F9就可评分,已测试显卡有K2000 2GB 900+分,GT330m 1GB 340+ 分,GT620 1GB 340+ 分,四代i5核显340+ 分,还有写博客的小盒子100+ 分。relaybot@re...

推荐文章

热门文章

相关标签