系统相关
首页 > 系统相关> > 西邮Linux兴趣小组2020年补纳题简析

西邮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。

反转链表的几种常用方法_TGRD4的博客-CSDN博客

 再次转载,问就是我也不会,我也在学。

Linux inode 详解 - LinSenGeGe - 博客园 

Linux建立软链接、硬链接_林夕一叶的博客-CSDN博客_软连接linux

 再次转载,问就是我也不会,我也在学。

 文件权限:

Linux常用命令:chmod修改文件权限 777和754_pythonw的博客-CSDN博客_linux给文件夹777权限

Linux修改文件权限(chmod)_紫藤&code的博客-CSDN博客_linux 修改文件权限

 

文件类型:

Linux文件类型详解 - Surpassme - 博客园

文件属性:

文件的属性及基本操作 - hunterDing - 博客园

属性和类型:

Linux下七种文件类型、文件属性及其查看方法_思维与睿智-CSDN博客_linux文件类型

标签:arr,return,int,博客,char,西邮,简析,2020,数组
来源: https://blog.csdn.net/weixin_63733944/article/details/121914845