一维数组的一般形式为:类型符 数组名 [常量表达式]
一维数组的使用:1.数组是使用下标来访问的,下标是从0开始。//int arr[10];
2.数组的大小可以通过计算得到。 //int sz=sizeof(arr)/sizeof(arr[0]);
一维数组在内存中的存储:数组在内存中是连续存放的。
一维数组的指针访问:数组的数组名其实就是数组首元素的地址,通过对数组名+整数的运算,就可以获得到数组每个元素的地址。
例:
#include
int main()
{
int arr[10]={0};
int i=0;
for(i=0;i
二维数组的一般形式为:类型说明符 数组名[常量表达式][常量表达式]
二维数组的使用:二维数组的使用也是通过下标的方式来访问的。
二维数组在内存中的存储:二维数组在内存中也是连续存放的。
二维数组的指针访问
注意:为了测定字符串的实际长度,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
#include
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
#include
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
#include
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
#include
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
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));
//16,第一行的地址解引用,第一行元素地址
printf("%d\n",sizeof(a[3]));
//16,数组第四行的地址大小,不需要访问,只计算大小
return 0;
}