目录
1.一维数组
2.字符数组
(1)以{ }初始化的字符数组
2.以“ ”初始化的字符数组
3.用字符指针进行初始化
2.二维数组
写在最后:
1.一维数组上节回顾:
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
2.&数组名,取出的是整个数组的地址。
3.除此之外的所以数组名均表示首元素的地址。
#include2.字符数组 (1)以{ }初始化的字符数组int main() { int a[] = {1,2,3,4}; printf("%dn",sizeof(a)); //a数组里面有四个int型的整数,所以输出为16,单位是字节 printf("%dn",sizeof(a+0)); //数组名a加0后仍然是首元素地址,输出为4/8个字节,看编译器 printf("%dn",sizeof(*a)); //表示a数组的首个元素1,输出为4个字节 printf("%dn",sizeof(a+1)); //数组名a加1后表示第二个元素的地址,输出为4/8个字节,看编译器 printf("%dn",sizeof(a[1])); //计算2所占用的字节,输出为4,单位是字节 printf("%dn",sizeof(&a)); //整个数组的地址,输出为/8个字节,看编译器 printf("%dn",sizeof(*&a)); //&a是数组的地址,对数组的地址进行解引用就是数组,所以输出为16 printf("%dn",sizeof(&a+1)); //&a+1是跳过一个数组a的大小,即下一个单位a数组的地址,但其本质上仍然是地址 printf("%dn",sizeof(&a[0])); //数组首元素的地址 printf("%dn",sizeof(&a[0]+1)); //数组第二个元素的地址 return 0; }
#includeint main() { //字符数组 char arr[] = { 'a','b','c','d','e','f' }; printf("%dn", sizeof(arr)); //此处sizeof计算的是该数组的大小,数组有6个char类型的元素,即6个字节 printf("%dn", sizeof(arr + 0)); //arr是数组首元素的地址,arr+1仍为数组首元素的地址,地址的大小为4/8个字节,看编译器 printf("%dn", sizeof(*arr)); //arr是数组首元素的地址,*a即为数组首元素的内容字母a,即为一个字节 printf("%dn", sizeof(arr[1])); //arr[1]=b,即为一个字节 printf("%dn", sizeof(&arr)); //&arr取的是数组的地址,地址的大小是4/8个字节,看编译器 printf("%dn", sizeof(&arr + 1)); //&arr是数组的地址,&arr+1是跳过一个单位a数组后的地址,地址的大小是4/8个字节,看编译器 printf("%dn", sizeof(&arr[0] + 1)); //数组第二个元素的地址,输入为4/8个字节,看编译器 printf("%dn", strlen(arr)); //strlen遇到字符串的结束标志''才会停止,在这个字符数组中没有'',编译器也会报warning,所以是随机值 printf("%dn", strlen(arr + 0)); //随机值--与上一个一样 printf("%dn", strlen(*arr)); //*arr = 'a',此处把97(字符a的Ascii码值)当成是一个地址,此处将会发生程序崩溃的现象,非法访问内存地址 printf("%dn", strlen(arr[1])); //程序崩溃--非法访问内存地址,造成程序崩溃,与上一个一样 printf("%dn", strlen(&arr)); //与strlen(arr)和strlen(arr+0)一样,因为数组的地址和数组首元素的地址在数值上是一样的,所以是个随机值 printf("%dn", strlen(&arr + 1)); //与前面的strlen(&arr)随机值有一个固定的差值,比那个小6(一个arr数组的长度) printf("%dn", strlen(&arr[0] + 1)); //与前面的strlen(&arr)随机值有一个固定的差值,比那个小1 return 0; }
下面是Devc++的运行结果:
#includeint main() { char arr[] = "abcdef"; printf("%dn", sizeof(arr)); //占用7个字节,数组所占空间的大小,字符串默认的结束标志'' printf("%dn", sizeof(arr + 0)); //arr是数组首元素的地址,+0仍为数组首元素的地址,地址的大小是4/8个字节,看编译器 printf("%dn", sizeof(*arr)); //arr是数组首元素的地址,对其进行解引用之后就是数组首元素,即a,输出为1个字节 printf("%dn", sizeof(arr[1])); //数组的第二个元素,即b,占一个字节 printf("%dn", sizeof(&arr)); //数组的地址,地址的大小是4/8个字节,看编译器 printf("%dn", sizeof(&arr + 1)); //跳过一个arr数组后的地址,地址的大小是4或者8个字节,看编译器 printf("%dn", sizeof(&arr[0] + 1)); //数组第二个元素的地址 printf("%dn", strlen(arr)); //从数组首元素的地址到''总共出现6个字符,''strlen函数不会计算在内,遇见统计停止 printf("%dn", strlen(arr + 0)); //数组名代表首元素的地址,加0后依旧是数组首元素的地址,6个字节 printf("%dn", strlen(*arr)); //程序崩溃--非法访问内存地址,因为访问了字符'a'的ascii码值作为的地址,行为非法 printf("%dn", strlen(arr[1])); /访问了数组第二个元素字符'b'的Ascii码值作为的地址 printf("%dn", strlen(&arr)); //&arr是数组的地址,与strlen(arr)结果是一样的 printf("%dn", strlen(&arr + 1)); //跳过了一个数组后的地址,后面的元素不确定,即不确定''出现在什么位置,结果随机 printf("%dn", strlen(&arr[0] + 1)); //数组第二个元素'b'的地址开始到''的字符的数目,''不计入在内,总共5个字符长度 return 0; }
下面是Devc++的运行结果:
3.用字符指针进行初始化#includeint main() { char* p = "abcdef"; printf("%dn", sizeof(p)); //p中存储的是a的地址,地址的大小为4/8个字节,看编译环境 printf("%dn", sizeof(p + 1)); //p中存储的是a的地址,p+1就是b的地址,地址的大小为4/8个字节,看编译环境 printf("%dn", sizeof(*p)); //p存储的是字符a的地址,对其进行解引用得到的是就是字符a,输出为1 printf("%dn", sizeof(p[0])); //p[0]就是字符a ,输出同样为1,与上面表达式相等 printf("%dn", sizeof(&p)); //&p就是指针变量p的地址,地址的大小是4/8个字节,看编译环境 printf("%dn", sizeof(&p + 1)); //指针变量p的地址加1,p的类型是char *p,&p的类型是char **p,&p+1就是跳过一个字符指针的大小,结果仍然是地址,输出4/8看编译环境 printf("%dn", sizeof(&p[0] + 1)); //其实就是字符'b'的地址,地址的大小就是4/8个字节,看编译环境 printf("%dn", strlen(p)); //p中存储的是a的地址,从a到'',不把''计入在内总共有6个字符 printf("%dn", strlen(p + 1)); //p中存储的是a的地址,p的类型是char *,跳过一个char元素的地址,即'b'的地址,即为5 printf("%dn", strlen(*p)); //非法访问以'a'的Ascii码值作为的地址,程序不能正常运行 printf("%dn", strlen(p[0])); /非法访问以'a'的Ascii码值作为的地址 printf("%dn", strlen(&p)); //随机值,此处是从指针变量p的地址开始, printf("%dn", strlen(&p + 1)); //随机&p的类型是char**,&p+1就是指针变量p的地址跳过一个char*类型,,地址值和地址后面的值我们都不清楚。所以结果是随机的 printf("%dn", strlen(&p[0] + 1)); //此处就是从第二个元素'b'的地址开始的,输出为5 return 0; }
下面是Devc++的运行结果:
2.二维数组#includeint main() { int a[3][4] = { 0 }; printf("%dn", sizeof(a)); //求的是整个数组所占空间的大小,三行四列共12个整型元素,48个字节 printf("%dn", sizeof(a[0][0])); //数组第一行第一个元素的大小,4个字节 printf("%dn", sizeof(a[0])); //a[0]是第一行的数组名,共4个元素,16个字节 printf("%dn", sizeof(a[0] + 1)); //a[0]表示的是第一行的数组名,加1后是第一行第二个元素的地址 printf("%dn", sizeof(*(a[0] + 1))); //对前面这一个进行解引用,解引用后就是第一行第二个元素 printf("%dn", sizeof(a + 1)); //此处a是数组名,此处a即是第一行的地址,加1后即为第二行的地址 printf("%dn", sizeof(*(a + 1))); //此处a+1是第二行的地址,也是第二行的数组名,此处等价于sizeof(a[1]),所以对其解引用后就是第二行的所有元素,即为16个字节 printf("%dn", sizeof(&a[0] + 1)); //a[0]是数组第一行的数组名,&a[0]就是第一行的地址,加1后就是第二行的地址 printf("%dn", sizeof(*(&a[0] + 1))); //对第二行的地址进行解引用之后得到的就是第二行的所有元素的内容 printf("%dn", sizeof(*a)); //a是首元素的地址,*a就是第一行内的所有元素的内容 printf("%dn", sizeof(a[3])); //第四行的数组名,a[3]是第四行数组,是16个字节 //在sizeof括号中的表达式不参与运算,也就是不进行访问,,就不会出现越界访问的错误了。 return 0; }
下面是Devc++的运行结果:
写在最后:
家里也下雪了,下楼取个快递,看见玩雪堆雪人的小孩才意识到自己的童年确实过去了,不知不觉已经长大成年了,心生感慨便拍下几张照片作为结尾把。
2022,奔赴下一场山河!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)