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