sizeof单目运算符---->求数组在内存中所占空间的大小(’\0’即使隐藏,大小也算)
如果不对数组定义空间大小的话,系统会根据里面的内容自动分配大小
若果去掉分配大小8,5的话,
此时系统为他们分配的大小为3,4(因为c只有c风格字符串后面系统默认加上’\0’)
strlen函数---->求c风格字符串的长度(’\0’大小不算在里面)
计算数组大小时,若里面不是字符串,
在末尾都要加上**’\0’,作为结束标志**,若果非字符串数组(常量数字,字符)没加’\0’,就会一直找’\0’,
中间会打印许多未定义字符,形成**“烫烫烫**”,直到找到’\0’
&arr+1 代表跨过整个数组
&arr[0]+1 代表指向数组第一个元素
strlen 函数不能对单个字符求大小
char name[] = { 'a', 'v', "无"};
printf("%d\n",strlen(name));//4
printf("%d\n", sizeof(name));//5
//1 表明" "系统会自己添加'\0'作为结尾标志
//2 字母一个字节,汉字两个字节
//3 strlen函数求得是字符串的长度,即所占字节数多少
// sizeof运算符算的是这个数组在内存中所占空间的大小
一维数组
#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
//数组名本身不能加减数字,此时隐式退化成指针就能进行加减操作
// 32位操作系统下,一个指针占4个字节
printf("%d\n", sizeof(*a)); //4
//要对它进行解引用,说明它隐式退化成指向数组首元素的指针
printf("%d\n", sizeof(a+1)); //4
//指针才能进行加减操作
printf("%d\n", sizeof(a[1])); //4
//求一个int型所占字节的大小
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
//指针加减数字也是指针,占4个字节
system("pause");
return 0;
}
字符数组–>也是个数组,可通过下标取值
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(arr)); //6
//sizeof运算符是求目标在内存中所占空间的大小,若有\0结尾,结果就是7
printf("%d\n", sizeof(arr+0)); //4
//指针才能进行加减运算
printf("%d\n", sizeof(*arr)); //1
//指针才能解引用,得到字符,一个字符占用一个字节
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)); //随机数(求数组里字符长度)
printf("%d\n", strlen(arr+0)); //(求指针指向的数组字符长度)
printf("%d\n", strlen(&arr)); //(求指针指向的数组字符长度)
//上面三个都是
//strlen是一个函数求c风格字符串长度,这个数组里没有以\0结尾,所以
//它就会一直找\0,直到随缘出现为止,
//若此处有'\0',strlen(&arr+1)就为5,从第一个数b开始计数
printf("%d\n", strlen(&arr + 1));
//数组指针+1,会跳过这个数组,跳到外界去,随机值
printf("%d\n", strlen(&arr[0] + 1));
//指针+1,会从b开始算,但找不到\0,所以取随机值,否则就是数组长度-1
//printf("%d\n", strlen(*arr)); //
//printf("%d\n", strlen(arr[1])); //
//上面这两个求单个字符的长度,此处不应进行strlen操作
printf("------------------------\n");
char* p = "abcdef";
//p存的地址是数组首元素的地址,即&a
printf("%d\n", sizeof(p)); //4
//p是指针类型的变量
printf("%d\n", sizeof(p+1)); //4
//指针相加减还是指针
printf("%d\n", sizeof(*p)); //1
//解引用得到a,a占一个字节
printf("%d\n", sizeof(p[0])); //1
//p[0]即取值为a,数组第0个元素
printf("%d\n", sizeof(&p)); //4
//二级指针本质上也是一级指针,占4个字节
printf("%d\n", sizeof(&p+1)); //4
printf("%d\n", sizeof(&p[0]+1));//4
printf("%d\n", strlen(p)); //6
//strlen以'\0'结尾,但并不将它计数
printf("%d\n", strlen(p+1)); //5
//指针+1也就是从b开始计数,有5个数
//printf("%d\n", strlen(*p)); //
//printf("%d\n", strlen(p[0])); //
//不能对一个字符使用strlen函数
printf("%d\n", strlen(&p)); //随机值
printf("%d\n", strlen(&p+1)); //随机值
//上面两个都是取随机值,第一个是个二级指针,指向的不是这个字符数组
//第二个是二级指针+1指向的不是这个字符数组
printf("%d\n", strlen(&p[0]+1));//5
//取p[0]的地址,+1得到&p[1],从这开始算字符串长度为5
system("pause");
return 0;
}
二维数组
以a[3][2]为例
a[0]是指向a[0][0]地址的指针,a[0]也就是a[0][0] a [0][1] a[0][2]的数组名
&a int ***
a int **
&a[0] int *
a[0] int *
&a[0][0] int *
a[0][0] int
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int a[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
printf("%d\n", sizeof(a)); //48
//二维数组在内存中是这样排列的1,2,3,4, 5,6,7,8, 9,10,11,12
//每个元素占4个字节4*12=48
printf("%d\n", sizeof(a[0][0])); //4
//数组第0行第0列的元素1,是int型
printf("%d\n", sizeof(a[0])); //16
//a[0]={1,2,3,4}有4个int型元素
printf("%d\n", sizeof(a[0]+1)); //4
//指针才能进行加减,一个指针4个字节
printf("%d\n", *(a[0] + 1)); //值为2
printf("%d\n", sizeof(*(a[0]+1))); //4
//参考上面
printf("------------\n");
printf("%d\n", sizeof(a+1)); //4
//数组隐式退化成指针
printf("%d\n", sizeof(*(a+1))); //16
//a+1即a[1]={5,6,7,8}
printf("%d\n", sizeof(&a[0]+1)); //4
//指针
printf("%d\n", sizeof(*(&a[0]+1))); //16
//a[1]={5,6,7,8}
printf("%d\n", sizeof(*a)); //16
//a[0]={1,2,3,4}
system("pause");
return 0;
}