数组的运用

来源:互联网 发布:java逆序输出语法 编辑:程序博客网 时间:2024/05/18 20:32

int main() 

//一维数组 
int a[] = {1,2,3,4}; 
printf(“%p\n”, a);// 
printf(“%p\n”, a+1); 
printf(“%d\n”, sizeof(*a)); 
// *a中a表示整型数组的首元素地址,*a表示首元素,整型数组,一个元素占4个字节。

printf("%p\n", &a);printf("%p\n", &a+1);printf("%d\n", sizeof(*&a));//&a表示整个数组的地址,加上*表示整个数组,这是一个包含四个元素的整型数组,所以占16个字节。printf("%d\n",sizeof(a));//16//数组名单独放到sizeof中时代表整个数组,因此sizeof(a)代表整个数组所占的内存,而这个数组a是一个整型数组每个元素占四个字节,四个元素总共占16个字节。printf("%d\n",sizeof(a+0));//4//数组名非单独放到sizeof中使用时代表数组首元素地址,因此sizeof(a+0)代表数组a中首 元素地址所占的内存,一个地址占四个字节。printf("%d\n",sizeof(*a));//4 //同上,a代表首元素地址,而*a代表首元素,整型数组一个元素占四个字节,所以sizeof(*a)占四个字节。printf("%d\n",sizeof(a+1));//4//a在sizeof中非单独使用,代表首元素地址,a+1代表第二个元素的地址,所以也占四个字节。printf("%d\n",sizeof(a[1]));//4//a[1]代表数组中第二个元素,整型数组每个元素占四个字节。printf("%d\n",sizeof(&a));//4//a单独出现在&后边时代表整个数组,&a就代表着整个数组的地址,因为是地址,所以占四个字节。printf("%d\n",sizeof(*&a));//16//上述,a单独出现在&后面时,代表整个数组,&a表示整个数组的地址,加上*代表整个数组,即*&a代表整个数组所有的元素,即占16字节。printf("%d\n",sizeof(&a+1));//4//&a代表整个数组的地址,之后加1,编程整个数组后面的地址,因为是地址,所以还占四个字节。printf("%d\n",sizeof(&a[0]));//4//a[0]数组中第一个元素,取地址占四个字节。printf("%d\n",sizeof(&a[0]+1));//4//a[0]+1数组中第二个元素,取地址,同理占四个字节。return 0;

}

int main() 

//字符数组 
char arr[] = {‘a’,’b’,’c’,’d’,’e’,’f’}; 
printf(“%d\n”, sizeof(arr));//6 
//数组名单独存在于sizeof后面代表整个数组,因为是字符数组,数组中每个元素占一个字节,所以6各元素总共占6个字节。 
printf(“%d\n”, sizeof(arr+0));//4 
//数组名非单独作用于sizeof后,代表数组首元素地址,首元素地址加上0还是首元素地址,地址占四个字节。 
printf(“%d\n”, sizeof(*arr));//1 
//同理 arr代表首元素地址,*arr代表首元素,因为是字符数组,一个元素占一个字节。 
printf(“%d\n”, sizeof(arr[1]));//1 
//arr[1]表示数组第二个元素,字符数组一个元素占一个字节。 
printf(“%d\n”, sizeof(&arr));//4 
// &arr 代表整个数组的地址,而地址只占四个字节。 
printf(“%d\n”, sizeof(&arr+1));//4 
// &arr+1代表整个数组后面相连的地址,地址占四个字节。 
printf(“%d\n”, sizeof(&arr[0]+1));//4 
//&arr[0]数组首元素的地址,加上1后表示数组第二个元素的地址,同样的地址占四个字节。

//strlen 求一个字符串的长度,当作用于一个字符数组时,即从这个字符数组的首元素地址开始向后检查,每遇到一个字符则加1,直到遇到\0,或者NULL时停止,不然会生成随机数。printf("%d\n", strlen(arr));//x//x表示随机数,因为数组中没有‘\0’和NULL,所以函数strlen会一直向后面的地址检索,会生成随机数。printf("%d\n", strlen(arr+0));//x// 原因同上述printf("%d\n", strlen(*arr));//err//err 错误,程序崩溃,因为*arr表示字符数组的首元素字符a,a的ascii码会被当做地址赋给strlen函数,函数在读取时会发生错误。而致使程序崩溃。printf("%d\n", strlen(arr[1]));//err//  原因同上,arr[1]是字符数组的首元素。printf("%d\n", strlen(&arr));//x//  因为strlen函数运行时,无法检索到\0和NULL,所以会生成随机数。printf("%d\n", strlen(&arr+1));//x//原因同上printf("%d\n", strlen(&arr[0]+1));//x//原因同上return 0;

}

int main() 
{

char arr[] = “abcdef”;//[a b c d e f \0] 
printf(“%d\n”, sizeof(arr));//7 
//当使用一个字符串来给一个字符数组初始化时,系统会默认给字符串后面加上\0,也就是说这个字符数组中的元素,会比看到的abcdef元素多一个元素,所以数组中是有7个元素的,字符数组每个元素占一个字节,所以整个数组占7个字节。 
printf(“%d\n”, sizeof(arr+0));//4 
// 数组名非单独作用于sizeof函数后,仅作数组首元素的地址,加上0还是首元素地址,地址占4个字节。 
printf(“%d\n”, sizeof(*arr));//1 
//*arr 作为整个字符数组的首元素,占1个字节。 
printf(“%d\n”, sizeof(arr[1]));//1 
// arr[1]字符数组的第二个元素,占1个字节。 
printf(“%d\n”, sizeof(&arr));//4 
// 整个字符数组的地址,占4个字节。 
printf(“%d\n”, sizeof(&arr+1));//4 
// &arr+1,表示整个字符数组后面相连的那个地址,地址占1个字节。 
printf(“%d\n”, sizeof(&arr[0]+1));//4 
//字符数组首元素地址加1,也就是数组的第二个元素的地址,占1个字节。

printf("%d\n", strlen(arr));//6//返回一个字符串的长度,arr代表整个数组的首元素的地址,strlen函数从第一个元素的地址开始检索,数组arr中前六个元素都是字符,知道第七个元素是\0,而strlen函数遇到\0会停止检索,返回前面检索到的字符的个数是6。printf("%d\n", strlen(arr+0));//6//arr+0,表示数组首元素地址,strlen函数从数组首元素地址开始检索,后面过程和上条命令一样。printf("%d\n", strlen(*arr));//err// *arr是数组的首元素,strlen 函数会以字符a的ASCII码为第一个地址开始检索,这时程序变回崩溃掉,printf("%d\n", strlen(arr[1]));//err//原因同上,这次是以字符b的ASCII码位地址开始检索。printf("%d\n", strlen(&arr));//6//&arr 表示整个数组的地址,也就是数组的首元素地址,strlen函数会以这个地址为起始地址开始检索字符,知道遇到第七个字符\0结束,返回前面的字符个数是6。printf("%d\n", strlen(&arr+1));//x//&arr+1 是整个数组后面相邻的那个地址,在数组外,strlen函数以这个地址开始检索,后面的地址里不知道放有什么,也不知道函数何时结束,则会生成随机数。printf("%d\n", strlen(&arr[0]+1));//5// &arr[0] 数组的首元素地址加上1,数组第二个元素的地址,strlen函数以数组的第二个元素地址开始检索,遇到\0结束,总共检索到5个字符。return 0;

}

int main() 

char *p = “abcdef”;// 
printf(“%d\n”, strlen(p));//6 
// 用字符串给一个字符指针初始化的时候,只把整个字符串的首元素地址赋给了字符指针,strlen(p)就是从字符串的首地址开始检索,知道遇到字符f后面的\0,结束,前面一共检索到6个字符,所以返回6。 
printf(“%d\n”, strlen(p+1));//5 
//指针p本身已经是字符串的首元素地址了,加上1变成字符串第二个元素的地址,strlen函数以字符串的第二个元素地址开始检索,到结束会检索到5个字符,所以返回5。 
printf(“%d\n”, strlen(*p));//err 
//字符指针p已经是字符串的首元素地址了,所以*p就代表着字符串的首元素,strlen函数以地址检索,因此会把字符a的ASCII码当做起始地址检索,这时程序就会崩溃。

rintf("%d\n", strlen(p[0]));//err//p[0]相当于*(p+0),字符串的首元素地址加0还是首元素地址,取*变成首元素,strlen函数还是把字符a的ASCII码当做起始地址开始检索。程序依然会崩溃掉。printf("%d\n", strlen(&p));//X// &p 是这个字符指针的地址,不是字符串的地址,strlen函数以字符指针的地址开始检索,指针的地址后面相连的地址不知道存放的是什么,strlen函数也不知道何时停下来,所以会返回随机数。printf("%d\n", strlen(&p+1));//X//  和上面的情况差不多,这次是从指针地址后面的相连的那个地址开始检索,依然返回随机数。printf("%d\n", strlen(&p[0]+1));//5//前面说了p[0]相当于*(p+0),即字符串的首元素,&p[0]表示字符串的首元素地址,在加上1表示字符串的第二个元素的地址,即字符b的地址,strlen函数以字符b的地址为起始地址开始检索,知道遇到\0,检索结束,一共检索到5个字符,所以返回5。printf("%d\n", sizeof(p));//4// 指针p是字符串首元素a的地址,一个地址占4个字节。printf("%d\n", sizeof(p+1));//4// 指针p是字符a的地址,p+1就是字符b的地址,只要是地址就占4个字节。printf("%d\n", sizeof(*p));//1// 指针p是字符a的地址,那么*p就是字符a,一个字符占1个字节。printf("%d\n", sizeof(p[0]));// 1-- *(p+0)//p[0]=*(p+0),即字符串的首元素字符a,一个字符占1个字节。printf("%d\n", sizeof(&p));//4//&p指针p的地址,地址占四个字节。printf("%d\n", sizeof(&p+1));//4// 指针p后面相邻的地址,还是占4个字节printf("%d\n", sizeof(&p[0]+1));//4// 字符串中第二个元素字符b的地址,占4个字节return 0;

}

原创粉丝点击