接受了老师的建议 会用代码块写代码了 不弄那些花里胡哨的了
**除了 sizeof(数组名) 数组名代表整个数组的大小 &数组名 数组名代表整个数组的大小 取出的是整个数组的地址 其他的数组名代表首元素地址
地址可以看作指针 在32位下指针为4个字节 在 64位下指针为8个字节**
#include<stdio.h>
int main()
{
int a[]={1,2,3,4};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a+0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(a[1]));
}
复制代码
#include<stdio.h>
int main()
{
int a[]={1,2,3,4};
printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(*&a));
printf("%d\n",sizeof(&a+1));
printf("%d\n",sizeof(&a[0]));
printf(‘%d\n",sizoef(&a[0]+1));
}
复制代码
# 二、字符数组
复制代码
#include<stdio.h>
int main()
{
char arr[]={'a','b','c','d','e','f'};
printf("%d\n",sizeof(arr));
printf("%d\n",sizeof(arr+0));
printf("%d\n",sizeof(*arr));
printf("%d\n",sizeof(arr[1]));
printf("%d\n",sizeof(&arr));
printf("%d\n",sizeof(&arr+1));
printf("%d\n",sizeof(&arr[0]+1));
return 0;
}
复制代码
#include<stdio.h>
int main()
{
char arr[]={'a','b','c','d','e','f'};
printf("%d\n",strlen(arr));
printf("%d\n",strlen(arr+0));
printf("%d\n",strlen(*arr));
printf("%d\n",strlen(arr[1]));
printf("%d\n",strlen(&arr));
printf("%d\n",strlen(&arr+1));
printf("%d\n",strlen(&arr[0]+1));
return 0;
}
复制代码
strlen 从当前地址 向后找到'\0’停止
>7. &arr[0]+1 arr[0]等价于*(arr+0)
即&*(arr+0)+1 arr作为数组名没有单独放在sizeof内部 也没有取地址
数组名代表首元素地址 即为第二个元素的地址 不知道什么时候找到
'\0' 即随机值-1
复制代码
#include<stdio.h>
int main()
{
char arr[]="abcdef";
printf("%d\n",strlen(arr));
printf("%d\n",strlen(arr+0));
printf("%d\n",strlen(*arr));
printf("%d\n",strlen(arr[1]));
printf("%d\n",strlen(&arr));
printf("%d\n",strlen(&arr+1));
printf("%d\n",strlen(&arr[0]+1));
return 0;
}
复制代码
a b c d e f \0 strlen从当前地址开始 到'\0' 1. arr作为数组名没有单独放在sizeof内部 也没有取地址 数组名代表首元素地址 即 6
>2. arr作为数组名没有单独放在sizeof内部 也没有取地址
数组名代表首元素地址 即6
>3.*arr . arr作为数组名没有单独放在sizeof内部 也没有取地址
数组名代表首元素地址 *arr 为第一个元素 即报错
>4.arr[1] 等价于 *(arr+1) . arr作为数组名没有单独放在sizeof内部
也没有取地址 数组名代表首元素地址
*(arr+1)为第二个元素 即报错
>5.&arr arr作为数组名 取地址 数组名代表整个数组
&arr代表整个数组的地址 从首元素地址开始 即 6
>6.&arr+1 .&arr arr作为数组名 取地址 数组名代表整个数组
&arr代表整个数组的地址
&arr+1表示跳过整个整个数组的下一块空间的地址
即随机值
>7. &arr[0]+1 arr[0]等价于 *(arr+0)
即 &*(arr+0)+1 &*可以抵消 arr作为数组名没有单独放在sizeof内部
也没有取地址 数组名代表首元素地址
&arr[0]+1为 第二个元素的地址 即5
复制代码
#include<stdio.h>
int main()
{
char*p="abcdef";
printf("%d\n",strlen(p));
printf("%d\n",strlen(p+1));
printf("%d\n",strlen(*p);
printf("%d\n",strlen(p[0]));
printf("%d\n",strlen(&p));
printf("%d\n",strlen(&p+1));
printf("%d\n",strlen(&p[0]+1));
return 0;
}
复制代码
p为一个字符指针 接收a的地址
6.&p+1 p本身为一个字符指针 指针的地址为二级指针 +1指向p本身末尾位置 但也是个地址 即随机值
7.&p[0]+1 p[0]等价于 *(p+0) 即& *(p+0)+1 &*可以抵消 即第二个元素的地址 即 5
#include<stdio.h>
int main()
{
int a[3][4]={0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizoef(a[0]));
printf("%d\n,sizoef(a[0]+1));
printf("%d\n",sizeof(*(a[0]+1)));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(*(a+1));
printf("%d\n",sizoef(&a[0]+1));
printf("%d\n",sizeof(*(&a[0]+1)));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3));
return 0;
}
复制代码
a[3] 代表第四行的元素 即 4*4=16