c语言的数组与字符串

来源:互联网 发布:海拔修正u50数据曲线 编辑:程序博客网 时间:2024/04/30 06:14

1.数组

  • 现在有一个简单的数组int a[10],以该数组作为例子分析
  • a是一个int *类型的变量。值是数组首元素a[0]的地址。其用法和含义都和数组首元素有关,与数组整体无关
  • &a是一个int (*) [10]类型的变量,值是数组首元素a[0]的地址。其用法和含义都和数组整体有关,与数组首元素无关
  • &a[0]是一个int *类型的变量,值是数组首元素a[0]的地址

测试:

a + 1的值是&a[1]&a + 1的值越界了(指向了后面一个数组去了....)&a[0] + 1的值是&a[1]
  • 注意,a这个int *类型的变量还有一种特殊用法,理论上它作为指针,大小应为4,但其实作为sizeof的参数时,可以求出数组的大小

测试:

sizeof(a)的值为40sizeof(&a)的值为4sizeof(&a[0])的值为4

2.二维数组

  • 二维数组的维度:以int a[2][5]为例,2是第一维,5是第二维
  • 二维数组维度分析和分析指针的方法一样,第一步,找变量名。第二步,根据优先级结合。首先a[2]结合,说明a是一个有2个元素的数组,其int [5]说明a内的元素是含有5个int的数组
  • 二维数组名称的含义:a是一个数组指针,指向了第二维的元素,在这里类型是int * [5],其值与&a[0]的值相同
  • 二维数组的指针访问:如果要访问a[i][j],思路是先访问a的第i个元素,再访问第i个元素的第j个元素
int (*p)[5];p = a;  //让指针指向数组的首元素地址*(*(p+i)+j) //这个表达式的值就是a[i][j],关于数组指针的解引用含义,详见4.1

3.字符串

  • 字符串的本质就是指针指向头,尾部固定,地址连续相连的一段内存
  • 字符串的尾部由'\0'标示,该字符的ascll码值为0
  • 用指针创建字符串:下面代码中,将一个指针指向了字符串,注意,这里字符串没有被分配内存,而是被分配在代码段了。所以该字符串是只读的,若妄图以p这个指针来修改字符串,则会引起段错误
char *p = "linux";
  • 用字符数组创建字符串:下面代码中,创建了一个数组来存储字符串,该字符串就和数组一样方便使用
char a[] ="linux";
  • 字符串与sizeof、strlen:sizeof可以求出类型所占的字节数。strlen可以求出字符串本体长度(不包括\0)

测试:

char a[] = "123456789";//strlen(a)的值是9(不包括\0)//sizeof(a)的值是10(包括了\0)char a[5];//strlen(a)的值是随机的//sizeof(a)的值是5char a[5] ="123456789";//strlen(a)的值大于等于5,数组初始化时多出来的字符会被截掉,但是第五个字符后面的栈是脏的,字符串不一定在这里停止//sizeof(a)的值是5char *p = "123456789";//strlen(p)的值是9(不包括\0)//sizeof(a)的值是4(仅仅指针的大小)
0 0
原创粉丝点击