1.数组名单独放在sizeof()内部,数组名表示整个数组。
sizeof(数组名)表示计算整个数组的大小,单位为字节。
2.&数组名 数组名表示整个数组。
&数组名 表示取出整个数组的地址
3.除此之外,数组名都表示首元素的地址
4.*为解除引用操作符
5.strlen是一个函数,为求字符串长度,以\0为结束标志,若字符里面没有遇到\0产生的是一个随机值。sizeof是一个取字节的运算符。
6.指针的意义
(1)指针加数字走多远与指针类型有关.int类型跳过4个字节,char类型逃过1个字节。
(2)用指针时访问的权限有多大。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main()
{
//一维数组
void test_1();
{
int a[] = { 1, 2, 3, 4 };
printf("%d\n", sizeof(a));// 16整个数组的地址
printf("%d\n", sizeof(a + 0));//4 首元素的地址
printf("%d\n", sizeof(a + 1));// 4第二个元素的地址
printf("%d\n", sizeof(*a));// 4首元素地址
//*a = *(a+0) = a{0}
//*arr[i] == *(arr+i)
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 第二个元素的地址
}
//字符数组
void test_2();
{
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 首元素大小
printf("%d\n", sizeof(arr[1])); // 1 第二个元素的大小
printf("%d\n", sizeof(&arr));//4 数组的首地址
printf("%d\n", sizeof(&arr + 1));//4 指向f的后边
printf("%d\n", sizeof(arr[0] + 1));// 4 第二个元素的地址
printf("%d\n", strlen(arr));//随机值
//strlen 为求字符串长度,遇到'\0'才结束,但\0不计算在内
printf("%d\n", strlen(arr + 0));//随机值
//printf("%d\n", strlen(*arr));// error
//printf("%d\n", strlen(arr[1]));//error
//*arr和arr[1]找的是a和b的ascll码值,但这里面找不到
printf("%d\n", strlen(&arr));//随机值
printf("%d\n", strlen(&arr + 1));//随机值
printf("%d\n", strlen(arr[0] + 1));//随机值
}
void test_3();
{
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//7 求字节长度
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 结果指向‘\0’的后边
printf("%d\n", sizeof(&arr[0] + 1));// 4 表示第二个元素的地址
printf("%d\n", strlen(arr));// 6 求字符串长度
printf("%d\n", strlen(arr + 0));// 6 同上
printf("%d\n", strlen(*arr));// error 相当于strlen('a'),非法访问地址
printf("%d\n", strlen(&arr));// 6 表示求数组arr的字节长度
printf("%d\n", strlen(&arr + 1));// 随机值 逃过整个数组,指向\0的后边
printf("%d\n", strlen(&arr[0] + 1));// 5 表示从第二个元素向后数,求字节长度
}
void test_4();
{
char *p = "abcdef";
printf("%d\n", sizeof(p));// 4表示指针变量
printf("%d\n", sizeof(p + 1));// 4 表示b的地址
printf("%d\n", sizeof(*p));// 1 *为接触应用操作符, 表示a
printf("%d\n", sizeof(p[0]));// 1 p[0]表示a,求字节长度
printf("%d\n", sizeof(&p));// 4 表示求指针变量的地址
printf("%d\n", sizeof(&p + 1));//4 表示指向*p的后边
printf("%d\n", sizeof(&p[0] + 1));//4 b的地址
printf("%d\n", strlen(p));//6 求字符串长度
printf("%d\n", strlen(p + 1));//5 从b开始向后数字符个数
printf("%d\n", strlen(*p));// error *为解除应用操作符 相当于strlen('a'),非法访问地址
printf("%d\n", strlen(p[0]));//error 相当于strlrn('a'),非法访问地址
printf("%d\n", strlen(&p));//随机值 对p取地址得到二级指针
printf("%d\n", strlen(&p + 1));//随机值 同上
printf("%d\n", strlen(p[0] + 1));//5 p[0]为第一个元素,p[0]+1为第二个元素,表示从第二个元素向后数
}
//二维数组
void test_5();
{
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//48 表示整个数组的字节长度
printf("%d\n", sizeof(a[0][0]));//4 表示首元素的字节长度
printf("%d\n", sizeof(a[0]));// 16 表示第一行的字节长度
printf("%d\n", sizeof(a[0] + 1));// 4 表示第二行第一个数
printf("%d\n", sizeof(a + 1));// 4 表示数组的第二行
printf("%d\n", sizeof(*a));// 16 表示第一行的地址
printf("%d\n", sizeof(a[3]));//16 a[3]会转化为a[0],
//因为sizeof()里的表达式不参与运算,而且sizeof()是在编译期间处理的,他会进行数据推断
}
system("pause");
return 0;
}