一维数组的一般形式为:类型符 数组名 [常量表达式]
一维数组的使用:1.数组是使用下标来访问的,下标是从0开始。//int arr[10];
2.数组的大小可以通过计算得到。 //int sz=sizeof(arr)/sizeof(arr[0]);
一维数组在内存中的存储:数组在内存中是连续存放的。
一维数组的指针访问:数组的数组名其实就是数组首元素的地址,通过对数组名+整数的运算,就可以获得到数组每个元素的地址。
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; }