编程小常识:数组的基本知识和有关数组的运算

一维数组的一般形式为:类型符 数组名 [常量表达式]
一维数组的使用:1.数组是使用下标来访问的,下标是从0开始。//int arr[10];
                           2.数组的大小可以通过计算得到。                  //int sz=sizeof(arr)/sizeof(arr[0]);
一维数组在内存中的存储:数组在内存中是连续存放的。
一维数组的指针访问:数组的数组名其实就是数组首元素的地址,通过对数组名+整数的运算,就可以获得到数组每个元素的地址。
例:
#include<stdio.h>  
int main()  
{  
 int arr[10]={0};  
 int i=0;  
 for(i=0;i<sizeof(arr)/sizeof(arr[0]);++i)  
 {  
  printf("&arr[%d]=%p\n",i,&arr[i]);//%p取地址  
 }  
 return 0;  
}  
二维数组的一般形式为:类型说明符 数组名[常量表达式][常量表达式]
二维数组的使用:二维数组的使用也是通过下标的方式来访问的。
二维数组在内存中的存储:二维数组在内存中也是连续存放的。
二维数组的指针访问
注意:为了测定字符串的实际长度,C语言规定一个“字符串结束标志”,以字符"\0",作为结束标志。如果字符串数组中存在若干个字符,前面9个字符都不是空字符("\0"),而第十个字符是"\0",则认为数组中有一个字符串,其有效字符为9个。也就是说,在遇到"\0"时,表示字符串结束,并且把它前面的字符当成一个字符串。
char arr[]="abc";//系统默认\0作为字符串结束标志  
char arr[3]={'a','b','c'}//无结束标志  
char*p="abcdef"//*p意为取字符串中首字母地址  
1. 数组名单独放在sizeof()内部,数组名表示整个数组
sizeof(数组名)计算的是整个数组的大小,单位是字节
2. &数组名,数组名表示整个数组&数组名,取出的是整个数组的地址
3. 除此之外所有的数组名都表示首元素的地址
指针的初步介绍:1.内存中的内一个内存单元(字节)对应一个地址。
                           2.在32为的平台上指针的大小是4个字节。64位平台是8个字节。
在C语言中取出某个变量地址
int n=10;  
&n;//取n都地址 
指针可以理解成一个专门存放地址的变量。
指针变量的定义:
int *p=NULL;//定义一个整型的指针变量,初始化为NULL  
char *p=NULL;//定义一个字符的指针变量,初始化位NULL  
当我们拿到指针的时候也要能够找到指针所指向的变量,这里就要用*(解引用操作符)

int n=10;int *p_n=&n;//将n的地址存放在p_n指针变量中。  
*p_n=20;//改变的其实是n这个变量内容。  
strlen与sizeof
strlen()是函数表示字符串长度sizeof()是算符,内部表达式不参与运算
short s=1;  
int n-10;  
printf("%d\n",sizeof(s=n+1));//2  
printf("%d\n".s);//1  
sizeof(数组)的sizeof值等于数组所占用的内存字节数,如:
char a1[] = "abc";  
int a2[3];  
sizeof( a1 ); // 结果为4,字符 末尾还存在一个NULL终止符  
sizeof( a2 ); // 结果为3*4=12(依赖于int)

有关数组的运算:运行环境在32位编译环境中
一维数组
#include<stdio.h>  
#include<string.h>  
int main()  
{  
    int a[]={1,2,3,4};  
    printf("%d\n",sizeof(a));  
    //16,计算数组大小,a[]中4个int型元素,一个元素四个字节,大小为16  
    printf("%d\n",sizeof(a+0));  
    //4,(a+0)是计算该数组第一个元素地址的大小  
    printf("%d\n",sizeof(*a));  
    //4,自动取数组a[]首元素地址,并计算大小  
    printf("%d\n",sizeof(a+1));  
    //4,(a+1)是计算该数组第二个元素地址的大小  
    printf("%d\n",sizeof(a[1]));  
    //4,计算该数组第二个元素地址的大小  
    printf("%d\n",sizeof(&a));  
    //4,取出数组的地址,地址为指针,而指针为四个比特位  
    printf("%d\n",sizeof(*&a));  
    //16,*代表解引用符号,实际还是计算a[]数组的大小  
    printf("%d\n",sizeof(&a+1));  
    //4,数组a[]下一个数组地址的大小  
    printf("%d\n",sizeof(&a[0]));  
    //4,数组a[]首元素地址大小  
    printf("%d\n",sizeof(&a[0]+1));  
    //4,数组a[]第二个元素地址大小  
return 0;  
}  

字符数组
#include<stdio.h>  
#include<string.h>  
int main()  
{  
 char arr[]={'a','b','c','d','e','f'};  
 printf("%d\n",sizeof(arr));  
 //6,计算数组大小,arr[]中6个char型元素,一个元素1个字节,大小为6  
 printf("%d\n",sizeof(arr+0));  
 //4,(arr+0)是计算元素地址的大小  
 printf("%d\n",sizeof(*arr));  
 //1,取数组arr[]首元素地址大小  
 printf("%d\n",sizeof(arr[1]));  
 //1,取数组第二个元素地址大小  
 printf("%d\n",sizeof(&arr));  
 //4,取数组地址的大小  
 printf("%d\n",sizeof(&arr+1));  
 //4,取数组arr[]下一个数组地址大小  
 printf("%d\n",sizeof(&arr[0]+1));  
 //4,取数组第二个元素地址  
 printf("%d\n",strlen(arr));  
 //随机值 在该字符串数组中没有'\0'作为结束标志,系统就会从首元素开始寻找'\0'做为结束标志,输出随机值  
 printf("%d\n",strlen(arr+0));  
 //随机值 在该字符串数组中没有'\0'作为结束标志,系统就会从首元素开始寻找'\0'做为结束标志,输出随机值  
 printf("%d\n",strlen(*arr));  
 //运行错误 *arr表示首元素地址,即'a',也就是从地址值为97开始找,但97是一个未知地址,访问的参数不同  
 printf("%d\n",strlen(arr[1]));  
 //运行错误 取arr的第二个元素,原因同上  
 printf("%d\n",strlen(&arr));  
 //随机值 从数组的首元素地址开始寻找'\0',输出随机值  
 printf("%d\n",strlen(&arr+1));  
 //随机值+6 跳过该数组寻找'\0'结束标志,输出上面的随机值+6  
 printf("%d\n",strlen(&arr[0]+1));  
 //随机值+5 从数组第一个元素开始跳过该元素寻找'\0'结束标志,输出上面随机值+5  
return 0;  
}  
#include<stdio.h>  
#include<string.h>  
int main()  
{  
 char arr[]="abcdef";  
 printf("%d\n",sizeof(arr));  
 //7,在该字符串数组中'\0'作为结束标志,也属于终止符  
 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,取数组arr[]下一个数组地址大小  
 printf("%d\n",sizeof(&arr[0]+1));  
    //4,取数组第二个元素地址,计算大小  
 printf("%d\n",strlen(arr));  
 //6,取数组中的字符串长度,以'\0'结束  
 printf("%d\n",strlen(arr+0));  
 //6,从第一个字符开始取计算字符串长度,以'\0'结束  
 printf("%d\n",strlen(*arr));  
 //运行错误 *arr表示首元素,即'a',就是从地址值为97开始找,但97是一个未知地址,访问的参数不同  
 printf("%d\n",strlen(arr[1]));  
 //运行错误 取arr的第二个元素,原因同上  
 printf("%d\n",strlen(&arr));  
 //6,从数组的首元素地址开是计算字符串长度,以'\0'结束  
 printf("%d\n",strlen(&arr+1)):  
 //随机值,跳过数组arr地址,一直寻找下去  
 printf("%d\n",strlen(&arr[0]+1));  
 //5,跳过首元素地址一直寻找下去  
return 0;  
}  
#include<stdio.h>  
#include<string.h>  
int maim()  
{  
    char *p="abcdef";  
    printf("%d\n",sizeof(p));  
    //4,取p的首元素第地址,计算大小  
    printf("%d\n",sizeof(p+1));  
    //4,取p的第二个元素地址,计算大小  
    printf("%d\n",sizeof(*p));  
    //1,使用解引用,相当于取p的首元素计算大小  
    printf("%d\n",sizeof(p[0]));  
    //1,取p的首元素地址,计算大小  
    printf("%d\n",sizeof(&p));  
    //4,取指针变量p的地址,计算大小  
    printf("%d\n",sizeof(&p+1));  
    //4,char * *pp=&p二级指针,加1跳过一个char *变量,而char *大小为四个字节  
    printf("%d\n",sizeof(&p[0]+1));  
    //4,取'b'的地址,计算大小  
  
    printf("%d\n",strlen(p));  
    //6,从'a'的地址开始寻找'\0'结束符  
    printf("%d\n",strlen(p+1));  
    //5,从'b'的地址开始寻找'\0'结束符  
    printf("%d\n",strlen(*p));  
    //运行错误,*p表示首元素,即'a',就是从地址值为97开始找,但97是一个未知地址,访问的参数不同  
    printf("%d\n",strlen(p[0]));  
    //运行错误,上同  
    printf("%d\n",strlen(&p));  
    //随机值,从p的首元素地址开始寻找'\0'结束符  
    printf("%d\n",strlen(&p+1));  
    //随机值  
    printf("%d\n",strlen(&p[0]+1));  
    //5,从第二个元素地址开始寻找'\0'结束符  
    return 0;  
}  
二维数组
#include<stdio.h>  
int main()  
{  
 int a[3][4]={0};  
 printf("%d\n",sizeof(a));  
 //48,数组中12个元素地址,48个字节  
 printf("%d\n",sizeof(a[0][0]));  
 //4,数组第一个元素地址的大小  
 printf("%d\n",sizeof(a[0]));  
 //16,数组第一行所有元素地址的大小  
 printf("%d\n",sizeof(a[0]+1));  
 //4,数组第一行地址名降级成首元素地址,为第一行首元素地址+1,第一行第二个元素  
 printf("%d\n",sizeof(a+1));  
 //4,数组a第二行的地址  
 printf("%d\n",sizeof(&a[0]+1));  
 //4,数组a第二行的地址,取第一行的地址+1  
 printf("%d\n",sizeof(*a));//sizeof(*(a+0))  
    //16,第一行的地址解引用,第一行元素地址  
 printf("%d\n",sizeof(a[3]));  
 //16,数组第四行的地址大小,不需要访问,只计算大小  
 return 0;  
}  







阅读更多
个人分类: C语言
上一篇编程小常识:操作符与表达式
下一篇求一个整数中二进制中1的个数
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭