西邮Linux兴趣小组2020年补纳题简析
作者:互联网
#include<stdio.h>
#include<string.h>
int main()
{
char*str="linux";//初始化一个字符串,s指向字符串首地址。
char a;//分配一个变量空间,大小为一个字节,char类型。
char *t=&a;//t指向a
strcpy(t,str);//将字符串"linux"拷贝到t所指向的地方,空间不足占用后边相邻的空间。
printf("t=%s\n",t);//输出t所指的字符串,即linux.
return 0;
}
定义:void func(int *p)
{
//语句......
}
调用:int array[5][10][20]
int* p;
p = (int*)array;
/*指针p此时指向三维数组首元(一个二维数组),它的值为二维数组首元的地址。
二维数组首元是一维数组,它的值为一维数组首元(一个int类型变量)的地址。
注:数组名即数组首元的地址*/
func(p);//传递三维数组首元地址给函数
转载一篇博客,可以了解了解:
三维(多维)数组与 指针 sizeof strlen_mzx1317557721的博客-CSDN博客_三维指针
错误在第四行:long*pr3=arr
没有进行强制类型转换,应该改为long*pr3=(long*)arr
&arr[0][0][0] A
&arr[0][0][1] A+1
&arr[0][1][0] A+3
&arr[1][0][0] A+15
&arr[1][0][1] A+16
&arr[0][1][1] A+4
arr A
**arr+1 A+3
*(*arr+1) A+15
**(arr+1) A+150
*(*(arr+1)+1 A+18
*(*(arr+1))+1 A+153
&arr1[][0][0]+1 A+16
&arr[0][2]+1 A+9
&arr[1]+1 A+30
&arr+1 A+150
pr1+2 A+2
pr2+2 A+8
pr3+2 A+16
pr4+2 A+8
t B
t+1 B+8
t[0]+1 B+336
&t[0]+1 B+8
*(&t[0]+1)+1 B+252
t[1] B+248
(int(*)[4])t[1] B+248
((int(*)[4])t[1])+1 B+256
*((int(*)[3][4])t[2]+1)+1 B+396
t[3] B
t[3]-1 B-4
关键点:
数组名就是数组首元的地址。
地址加减是加减一个元素类型的大小。
三维数组解引用*一次后,即*arr,为二维数组,两次为一维,三次为一维数组元素。
方法很多:
方法一:itoa函数
itoa函数将数值转换为字符串,通过规定转换进制实现。
#include<stdio.h>
#include<stdlib.h>
//注意必须调用stdlib.h函数库
int main(void){
int a=1000;
char str[30];
itoa(a,str,2);//2即是代表转换为2进制
printf("%s",str);
return 0;
}
方法二:短除法
短除法,将十进制转换为二进制的笔算过程通过简单的代码实现。
#include<stdio.h>
int main(void){
int a,b,k,i;
int remainder[30];
//定义了一个remainder数组,用来收集短除法除得的余数,栈倒序输出。
a=1000;
k=0;
while(a!=0){
b=a/2;
k++;
remainder[k]=a-b*2;
a=a/2;
};
for (i=k;i>=1;i--){
printf("%d",remainder[i]);
}
return 0;
}
方法三:按位取与
#include<stdio.h>
int main(int argc,char*argv[])
{
int number;
unsigned mask;
mask=1u<<31;
scanf("%d",&number);
while(mask)
{
printf("%d",(number&mask)?1:0);
mask>>=1;
}
return 0;
}
可移植性差,tmp可能在程序中已经被定义过,使用这个宏会出现问题。
可以用亦或或者加减运算实现:
亦或:#define swap(a,b) (a)^=(b)^=(a)^=(b)
加减运算:#define SWAPVALUE(a,b) {(a)=(a)+(b);(b)=(a)-(b);(a) = (a)-(b);}
我直接转载:
结构体在内存中的对齐规则_咕唧咕唧shubo.lk的专栏 -CSDN博客_结构体内存对齐规则
1.struct或者union的成员,第一个成员在偏移0的位置,之后的每个成员的起始位置必须是当前成员大小的整数倍;
2.如果结构体A含有结构体成员B,那么B的起始位置必须是B中最大元素大小整数倍地址;
3.结构体的总大小,必须是内部最大成员的整数倍.
我直接再次转载:谈谈C语言从源文件变为可执行文件之间发生的过程详解(C程序的编译链接运行)_呋喃吖的博客-CSDN博客_c文件编译可执行文件
大概就是这样一个过程:
先将源文件翻译为计算机可以识别的机器指令,然后再让及算计执行这些指令。
翻译的过程主要使编译+链接;
编译器编译各个源文件为目标文件,然后由链接器链接各个目标文件成为可执行文件;
char Change(char a)
{
if (a == '}') return '{';
if (a == ']') return '[';
if (a == ')') return '(';
return '0';
}
bool isValid(char* s)
{
int len = strlen(s);
char ch;
int st[len + 1], top = 0,i;
if (len % 2 == 1)
return false;
for (i = 0; i < len; i++)
{
ch = Change(s[i]);
if (ch!='0')
{
if (top == 0 || st[top - 1] != ch)
return false;
top--;
}
else
st[top++] = s[i];
}
return top == 0;
}
还没看链表,之后一定看,再次转载,感谢TGRD4。
bool hasCycle(struct ListNode* head)
{
if (head == NULL || head->next == NULL) //空链表和只有一个结点的链表没有环
return false;
struct ListNode* p, * q; //p为慢指针,q为快指针
p = head; //初始化快慢指针
q = head->next;
while (q != NULL && q->next != NULL) //两个指针遍历链表
{
if (q == p) //快慢指针访问同一个结点,则该链表有环
return true;
p = p->next; //慢指针一次移动一步
q = q->next->next; //快指针一次移动两步
}
return false; //两个指针没有相遇,无环
}
同上,让我们再次感谢TGRD4。
再次转载,问就是我也不会,我也在学。
Linux inode 详解 - LinSenGeGe - 博客园
Linux建立软链接、硬链接_林夕一叶的博客-CSDN博客_软连接linux
再次转载,问就是我也不会,我也在学。
文件权限:
Linux常用命令:chmod修改文件权限 777和754_pythonw的博客-CSDN博客_linux给文件夹777权限
Linux修改文件权限(chmod)_紫藤&code的博客-CSDN博客_linux 修改文件权限
文件类型:
文件属性:
属性和类型:
Linux下七种文件类型、文件属性及其查看方法_思维与睿智-CSDN博客_linux文件类型
标签:arr,return,int,博客,char,西邮,简析,2020,数组 来源: https://blog.csdn.net/weixin_63733944/article/details/121914845