c: arry

发布时间 2023-10-29 14:48:33作者: ®Geovin Du Dream Park™

 

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>


/**
 * @brief 
 * 
 * @param arr 
 * @param length 
 * @param key 
 */
void removenum(int arr[],int length,int key);
/**
 * @brief 
 * 
 * @param arr 
 * @param length 
 */
void printnum(int arr[],int length);

/**
 * @brief 
 * 
 * @param arr 
 * @param length 
 */
void printnum(int arr[],int length)
{
    assert(arr!=NULL);
    for(int i=0;i<length;i++)
    {
        printf("%d\n",arr[i]);
    }
}
/**
 * @brief 
 * 
 * @param arr 
 * @param length 
 * @param key 
 */
void removenum(int arr[],int length,int key)
{

    assert(arr!=NULL);
    for(int i=0;i<length;i++)
    {
        if(key==arr[i])
        {
              for(int j=0;j<length-1;j++)
              {
                arr[i]=arr[j+1];
              }  
              arr[length-1]=0;
              i--;
        }
    }


}


int arr[12] = { 10,20,30,40,50,60,70,80,90,100,110,120 };
int(*parr)[12] = &arr;//==int[12]* parr=&arr;   *parr指向 int arr[12]的数组。数组里面存储的是12个元素的整形数据。
int* pparr = &arr[0];//==int* pparr[12]= &arr[0],数组元素存储的是指针




void show()
{
    printf("sizeof(arr)=%ld\t sizeof(parr)=%ld\n",sizeof(arr),sizeof(parr));//sizeof(arr)=48   sizeof(parr)=8
    //特别注意的是:指针和数组,sizeof是不一样,但是访问元素的时候,可以是相同的形式
    //sizeof(parr)是指针:占用的内存为8个字节是指针固定占用的内存空间。
    //sizeof(arr)是数组:占用的是元素个数总和的空间。
    printf("*arr=%d,parr=%d,*pparr=%d,\n",*arr,*(*parr),*parr);
    printf("arr=%p\t parr=%p\n",arr,parr);//都是指向数组的首地址
    //parr:数组指针指向的是一个数组,准确的说,指向的是一个数组首个元素的地址
    printf("*parr=%p\n",*parr);
    //parr是一个指针指向的是arr数组,arr数组返回的又是数组元素的手地址,所以*parr返回的是arr数组首个元素的地址
    printf("*(*parr)=%d\n",*(*parr));//10
    //*(*parr)先解引用parr得到的是第一个元素的地址,在解引用指针就能获取元素的值
    printf("parr访问第二个元素地址=%p\n",*parr+2);
    printf("arr+1=%p\t parr+1=%p\n",arr+1,parr+1);
    //arr指向的是数组的首地址,+1后表示下一个地址
    //parr:指针指向的是arr的整个数组,parr+1后指向的就是下一个数组首个元素的地址。
    for(int j=0;j<4;j++)
    {

    }
    //遍历
    for(int i=0;i<12;i++)
    {
        printf("第%d个元素的地址=%p\t 第%d个元素的值=%d\n",i,*parr+i,i,*(*parr+i));
    }


}




int main()
{
    printf("geovindu\n");
    printf("hello world!");
    printf("你好,世界\n");


    int arrdu[4][5]={10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200};


    int arrd[3][4]={10,20,30,40,50,60,70,80,90,100,110,120};
    int (*pp)[4]=arrd;
    //printf("%d",(*pp)[0]);
    //printf("%d",(*pp)[1]);
    //printf("%d",*pp[0]);
    //printf("%d",*pp[1]);
    //1.
    printf("1列的首位元素\n");
    for(int k=0;k<3;k++)
    {
          printf(" %d ",*pp[k]); //列的首位元素
    }
    printf("\n2第一行的遍历值\n");
    for(int k=0;k<3;k++)
    {
         printf(" %d ",(*pp)[k]); //第一行的遍历值
    }
    printf("\n3列的首位元素\n");
    //3.
    for(int k=0;k<3;k++)
    {
            printf(" %d ",pp[k][0]); //列的首位元素
    }
    printf("\n4第一行的遍历值\n");
    //4 第一行的遍历值
    for(int k=0;k<4;k++)
    {
            printf(" %d ",(*pp)[k]);
    }

    printf("*((*pp)+1)=%d\n",*((*pp)+1));
    printf("*pp[1]=%d\n",*pp[1]);  //50
    printf("(*pp[1])+1=%d\n",(*pp[1])+1); //51
    printf("*(*pp+1)=%d\n",*(*pp+1));
    printf("*(*arrd+1)=%d\n",*(*arrd+1));
    printf("*arrd[1]=%d\n",*arrd[1]); //50
    printf("*arrd[1]=%d\n",*arrd[1]); //50
    

    printf("\n6遍历二维数组\n");
    int *dup;
    dup=arrd[0];
    for (int i = 0; i < sizeof(arrd) / sizeof(int); i++)
    {
        //printf("%d ",&arrd[i]);
        //p = arr[i];
        printf("%d ",*dup++);
    }
    printf("\n7遍历二维数组\n");
    //6 遍历二维数组
    for(int j=0;j<3;j++)
    {   
        
        for(int k=0;k<4;k++)
        {
            printf(" %d ",pp[j][k]);
        }
        printf("\n");
    }
    printf("\n");


    show();

    char b[]="agbdkfjdkajfkdasjfdkla";
    printf("%ld",sizeof(b));
    int c=sizeof(b)/sizeof(b[0]);
    printf("%d",c);
    for (int i = 0; i < c; i++)
    {
        printf("i=%d,\t b=%c,\b 内存地址=%p\n",i,b[i],&b[i]);
    }
    

    int num[5]={1,2,3,4,5};

    removenum(num,5,3);
    printnum(num,5);


    system("pause");
    return 0;
}