`**
数组名的意义:
**
1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
3. 除此之外所有的数组名都表示首元素的地址
arr与&arr的了解与区分
arr是数组名,数组名表示数组首元素的地址。
&arr 表示的是数组的地址,而不是数组首元素的地址。(虽然值是一样的)
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
printf("arr = %p\n", arr);//0133FBB0
//数组首元素的地址
printf("&arr= %p\n", &arr);//0133FBB0
//&arr 表示的是数组的地址,。(虽然值是一样的,但是两者的含义不同)
printf("arr+1 = %p\n", arr+1);//0133FBB4 加4
//数组首元素的地址加1操作 跳一个元素的地址
printf("&arr+1= %p\n", &arr+1);//0133FBD8 加40
//数组的地址+1,跳整个数组的大小,所以 &arr+1 相对于 &arr 的差值是40
return 0;
}
sizeof与strlen对数组型的分析
strlen 是函数,sizeof 是运算操作符,二者得到的结果类型为 size_t,即 unsigned int 类型。大部分编译程序在编译的时候就把 sizeof 计算过了,而 strlen 的结果要在运行的时候才能计算出来。
sizeof 获得的是类型或变量所占的地址空间,32 位操作系统对应 4 字节; 。。。。 strlen 返回的是该字符串的长度,遇到 \0 结束, \0 本身不计算在内。
总结一句就是 sizeof 计算的是变量的字节大小,而 strlen 计算的是字符串的长度,前者不受字符 \0 影响,后者以 \0 作为长度判定依据。
地址的字节和指针一样大小是固定的4个字节
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <stdlib.h>
int main()
{
int a[] = { 1, 2, 3, 4 };
printf("%d\n", sizeof(a));//16
printf("%d\n", sizeof(a + 0));//4 数组首元素的地址 地址的字节大小为4
printf("%d\n", sizeof(*a));//4
printf("%d\n", sizeof(a + 1));//4 第二个元素的地址
printf("%d\n", sizeof(a[1]));//4 第二个元素的地址
printf("%d\n", sizeof(&a));//4 数组的地址
printf("%d\n", sizeof(*&a));//16 解引用整个数组
printf("%d\n", sizeof(&a + 1)); //4 下一个数组的地址
printf("%d\n", sizeof(&a[0]));//4 首元素的的地址
printf("%d\n", sizeof(&a[0] + 1));//4 第二个元素的地址
return 0;
}
//一维数组
//字符数组
int main()
{
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(arr));//6 整个数组的字节大小
printf("%d\n", sizeof(arr + 0));//4 数组首元素的地址,
printf("%d\n", sizeof(*arr));//1 解引用arr数组首元素的地址取得‘a’,为char类型占一个字节大小
printf("%d\n", sizeof(arr[1]));//1 第二个元素 ‘b’
printf("%d\n", sizeof(&arr));//4 数组的地址
printf("%d\n", sizeof(&arr + 1));//4 下一个(层)数组的地址
printf("%d\n", sizeof(&arr[0] + 1));//4 数组第二个元素的地址
printf("%d\n", strlen(arr));// 随机数 n //数组首元素的地址
printf("%d\n", strlen(arr + 0));//首元素的地址
printf("%d\n", strlen(*arr));// 第一个元素 与strlen函数的参数不符
printf("%d\n", strlen(arr[1]));//第二个元素
printf("%d\n", strlen(&arr)); //整个数组的地址
printf("%d\n", strlen(&arr + 1));//下一个数组的地址
printf("%d\n", strlen(&arr[0] + 1));// n-1 //第二个元素的地址
return 0;
}
//字符串数组
int main(){
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));// 7 整个数组的字节大小 6+1 字符串以/0结尾算一个字节
printf("%d\n", sizeof(arr + 0));//4 首元素的地址
printf("%d\n", sizeof(*arr));// 1 解引用首元素的地址
printf("%d\n", sizeof(arr[1]));//1 第二个元素
printf("%d\n", sizeof(&arr));//4 整个数组的地址
printf("%d\n", sizeof(&arr + 1));//4 第二个数组的地址
printf("%d\n", sizeof(&arr[0] + 1));//4 第二个元素的地址
printf("%d\n", strlen(arr));// 6 strlen函数就是求字符串的长度的
printf("%d\n", strlen(arr + 0));//6 首元素的地址
printf("%d\n", strlen(*arr));// 第一个元素 与strlen函数的参数不符
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;
}
int main(){
char *p = "abcdef";
printf("%d\n", sizeof(p));// 4 指针变量p存的地址 首元素的地址
printf("%d\n", sizeof(p + 1));// 4 第二个元素的地址
printf("%d\n", sizeof(*p));// 1 解引用为字符串abcdef的首元素a 类型为char 一个字节大小
printf("%d\n", sizeof(p[0]));//1 p[0]等价于*(p+0) 还是首元素a
printf("%d\n", sizeof(&p));// 4 p本来就是一个地址,再加一个取地址符号就相当于二级指针了,但是还是指向的地址
printf("%d\n", sizeof(&p + 1));//4
printf("%d\n", sizeof(&p[0] + 1));//4
printf("%d\n", strlen(p));//6 从第一个元素的地址开始,直到遇见\0停止
printf("%d\n", strlen(p + 1));//5 从 第二个元素的地址开始,直到遇到\0停止
printf("%d\n", strlen(*p));// 第一个字符,char类型与strlen函数参数不匹配
printf("%d\n", strlen(p[0])); //相当于*(p+0)第一个字符
printf("%d\n", strlen(&p));// 二级指针
printf("%d\n", strlen(&p + 1));
printf("%d\n", strlen(&p[0] + 1));
return 0;
}
int main()
{
//二维数组 二维数组名代表数组指针,指向第一个一维数组的地址
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//48 4*3*4=48 int 四个字节 数组里12个元素
printf("%d\n", sizeof(a[0][0]));//4 数组首元素整型0
printf("%d\n", sizeof(a[0]));//16 4*4=16 整个第一个一维数组a[0]的字节大小 int 四个字节 数组里4个元素 []操作符自带解引用
printf("%d\n", sizeof(a[0] + 1));//4 地址 *(a+0)+1 a[0]代表第一个一维数组,数组名进行加减操作时会变为地址加减,加减的步长这个数组名的类型
printf("%d\n", sizeof(*(a[0] + 1)));// 4 地址
printf("%d\n", sizeof(a + 1));//4 二维数组名代表数组指针,指向第一个一维数组的地址 a+1代表第二个一维数组的地址
printf("%d\n", sizeof(*(a + 1)));//16 解引用第二个一维数组
printf("%d\n", sizeof(&a[0] + 1));//4 地址
printf("%d\n", sizeof(*(&a[0] + 1))); //16 解引用第二个一维数组
printf("%d\n", sizeof(*a));//16
printf("%d\n", sizeof(a[3]));//16 第四个一维数组的字节大小
return 0;
}