持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
sizeof(数组)
#include<studio.h>
int main(void)
{
int a[]={1,2,3,4,5,6,7,8,9};
int min,max;
printf("main sizeof(a[])=%lu\n",sizeof(a));
printf("main a=%p\n",a);
minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
printf("a[0]=%d\n",a[0]);
printf("%d%d",min,max);
return 0;
}
void minmax(int a[],int len,int *min,int *max)
{
int i;
*min=*max=a[0];
printf(“minmax sizeof(a[])=%lu\n”,sizeof(a));
printf("minmax a=%p\n",a);
a[0]=1000;
for(i=1;i<len;i++){
if(a[i]<*min){
*min=a[i];
}
if(a[i]>max){
*max=a[i];
}
}
}
main里的sizeof是68,minmax里的sizeof是4(4是一个指针的大小或者说一个地址的大小)
printf("main a=%p\n",a):看a的地址
结果:main 和 minmax 里面a的是相同地址,即这里的a数组是同一个数组。
综上所述,数组是指针。
- sizeof(a)==sizeof(int *)
- 但是可以用数组的运算符[]进行运算 数组参数
- 以下四种函数原型是等价的
- int sum(int *ar,int n);
- int sum(int *, int);
- int sum(int ar[], int n);
- int sum(int [],int); 数组变量是特殊的指针
- 数组变量本身表达地址
- int a[10];int *p=a;//无需用&取地址
- 但是数组的单元表达的是变量,需要用&取地址
- a==&a[0]
- []运算符可以对数组做,也可以对指针做;
- p[0]<==>a[0]
- *运算符可以对指针做,也可以对数组做
- 数组变量是const的指针,所以不能被赋值
- int a[]<==>int *p const a=....
int *p=&min; printf("*p=%d",*p); printf("p[0]=%d",p[0]);*p==p[0]
输出值都是2,都是为了取出p所指向的地址存放的数值printf("*a=%d",*a);输出为1000
int b[]; b=a;数组之间不能互相赋值,数组是常量指针,被创建后不能被改变。
指针与const
const:不能被修改
指针=指针+指针所指的变量
- 指针是const
- 表示一旦得到了某个变量的地址。不能再指向其他变量
- int * const q=&i;//q只能指向i的地址
- *q=26;//OK//可以对q指向的地址的值进行操作
- q++;//ERROR//但是不能对q进行运算
- 所指是const
- 表示不能通过这个指针去修改那个变量(并不能使得那个变量成为const)
- const int *p=&i;//
- *p =26;//ERROR//不能通过这个指针去修改这个指针指向的变量的值
- i=26;//OK//i可以被修改
- p=&j;//OK//p也可以被修改 q:判断的标志是const在*的前面还是后面
int i;
const int * p1=&i;
int const * p2=&i;
int * const p3=&i;