一维数组、二维数组、字符数组的&、sizeof等操作
来源:互联网 发布:好听的翻唱知乎 编辑:程序博客网 时间:2024/06/05 21:10
一 前提知识
1、sizeof是一个运算符,sizeof(a)计算的是a这种变量类型或结构体所占的字节数
2、变量名一旦进行了移位操作,那么他就退化成了指针
3、数组名和对数组名取地址的值是一样的,但是含义不一样
4、数组名和指针的区别
只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量。而只有以下两种情况,才不被当做指针常量:
sizeof(数组名):返回数组长度(所占的字节数,不是数组元素个数),而不是指向数组的指针的长度。
&数组名:产生一个指向数组的指针,而不是一个指向某个指针常量的指针。
二 一维数组
要注意的是
1)sizeof(&a)的值是4,因为它的含义是一个指针;
2)变量名一旦进行了移位操作,那么他就退化成了指针所以a+1是指针的含义,所以为4
三 二维数组
int main99912() { int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int n=sizeof(a[0][0]); printf("a=0x%x,*a=0x%x\n",a,*a); printf("a size=%d,*a size=%d\n",sizeof(a),sizeof(*a)); printf("-------------------------------------------\n");
printf("a[0]=0x%x,*(a+0)=0x%x\n",a[0],*(a+0)); printf("a[0] size=%d,*(a+0)=%d\n",sizeof(a[0]),sizeof(*(a+0)));printf("-------------------------------------------\n");
printf("&a[0]=0x%x,&a[0][0]=0x%x\n",&a[0],&a[0][0]); printf("&a[0] size=%d,&a[0][0] size=%d\n",sizeof(&a[0]),sizeof(&a[0][0])); printf("-------------------------------------------\n"); printf("a[1]=0x%x,a+1=0x%x\n",a[1],a+1); printf("a[1] size=%d,a+1=%d\n",sizeof(a[1]),sizeof(a+1)); printf("-------------------------------------------\n");
printf("&a[1][0]=0x%x,*(a+1)+0=0x%x\n",&a[1][0],*(a+1)+0); printf("&a[1][0] size=%d,*(a+1)+0 size=%d\n",sizeof(&a[1][0]),sizeof(*(a+1)+0)); printf("-------------------------------------------\n"); printf("a[2]=0x%x,*(a+2)=0x%x\n",a[2],*(a+2)); printf("a[2] size=%d,*(a+2) size=%d\n",sizeof(a[2]),sizeof(*(a+2))); printf("--------------------------------------- ---\n"); printf("&a[2]=0x%x,a+2=0x%x\n",&a[2],a+2); printf("&a[2] size=%d,a+2 size=%d\n",sizeof(&a[2]),sizeof(a+2))
printf("-------------------------------------------\n");
printf("a[1][0]=0x%x,*(*(a+1)+0)=0x%x\n",a[1][0],*(*(a+1)+0)); printf("a[1][0] size=%d,*(*(a+1)+0) size=%d\n",sizeof(a[1][0]),sizeof(*(*(a+1)+0))); printf("-------------------------------------------\n"); return 0; }
解决上面需要注意的问题是:
printf("a size=%d,*a size=%d\n",sizeof(a),sizeof(*a));
这句代码中,sizeof(a)表示整个二维数组的大小,*a表示*(a+0),所以,*a表示一维数组{1,3,5,7}的首地址,因此sizeof(*a)是4*sizeof(int)为16。
printf("a[0] size=%d,*(a+0)=%d\n",sizeof(a[0]),sizeof(*(a+0)));
a[0]也就是*(a+0),和*a一样,也是指向一维数组{1,3,5,7}的首地址,因此a[0],*(a+0)用sizeof计算内存大小,是4*sizeof(int)为16
printf("&a[0] size=%d,&a[0][0] size=%d\n",sizeof(&a[0]),sizeof(&a[0][0]));
&a[0]就是&(*(a+0)),&和*互相抵消,因此相当于a+0,数组名参与了指针偏移运算,因此sizeof(&a[0])的大小为指针的内存小,是4字节。&a[0][0]就是&(*(*(a+0)+0)),&和*抵消以后,为*(a+0)+0,*(a+0)代表一维数组{1,3,5,7}的首地址,因此*(a+0)+0表示数组首地址参与偏移操作,成为指向数组{1,3,5,7}0号位元素1的指针,sizeof(&a[0][0])的大小为4字节。
四 字符串数组
- #include "stdio.h"
- char *get_string_1()
- {
- char p[] = "hello world!";
- return p;
- }
- char *get_string_2()
- {
- char *p = "hello world!";
- return p;
- }
- int main()
- {
- char *p;
- p = get_string_1();
- printf("get_string_1:%s/n",p);
- p = get_string_2();
- printf("get_string_2:%s/n",p);
- return 0;
- }
get_string_1:(乱码或者没有输出,linux下没有任何输出)
get_string_2:hello world!
- 一维数组、二维数组、字符数组的&、sizeof等操作
- 指针的相关运算,包括一维数组、二维数组、字符数组的sizeof、strlen运算
- 一维数组、二维数组、字符数组、指针 相关的 sizeof 计算
- 一维数组,字符数组,字符串,二维数组在sizeof()和strlen()下的不同输出
- 数组指针操作一维二维数组
- sizeof与一维数组和二维数组
- 攻克一维二维数组以及冒泡等各种排序思维,进一步了解字符数组级string的数据
- sizeof 和 strlen 在求解数组 字符数组 字符串 二维数组时候的小结
- 一维数组和二维数组的运算(sizeof与strlen的区别)
- 数组的操作--二维数组
- js 的一维数组,二维数组
- 一维数组、二维数组
- sizeof与二维数组
- 简单的输入输出、一维数组、二维数组、普通遍历、使用foreach语句遍历数组操作
- Java数组 一维数组,二维数组
- array 数组 一维数组 二维数组
- Javascript - 数组 一维数组 二维数组
- 数组(一维数组和二维数组)的用法
- 查看本机编码方式
- Java基础概念
- java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this a
- 使用Eclipse的Working Set,界面清爽多了
- Spring注解@Component、@Repository、@Service、@Controller区别
- 一维数组、二维数组、字符数组的&、sizeof等操作
- maven环境变量的配置及+eclipse的配置使用
- 解决CTS测试项testIsUserAMonkey
- 在iOS 8中使用UIAlertController
- iOS-iOS内购流程(手把手图文教程)
- 什么是抽象类
- 2 find命令之xargs
- poj3233Matrix Power Series (等比矩阵求和)
- 459. Repeated Substring Pattern