数组
数组的特点:
只能存放一种类型的数据,比如int类型的数组、float类型的数组
初始化方式
int a[3] = {10, 9, 6}; int a[3] = {10,9}; int a[] = {11, 7, 6}; int a[4] = {[1]=11,[0] = 7};
常见错误
int a[]; int[4] a; int a[b]; a = {10, 11}; a[4] = {10,9,8,5};
内存分析
数组存储空间的大小
存储空间的划分(内存的分配是从高地址到低地址进行的,但一个数组内部元素又是从低到高进行的)
数组越界的注意
二维数组
二维数组是一个特殊的一维数组:它的元素是一维数组。例如int a[2][3]可以看作由一维数组a[0]和一维数组a[1]组成,这两个一维数组都包含了3个int类型的元素
初始化
int a[3][4] = {1,2,3,4,5,6};
int a[3][4] = {{},{},{}};
int a[][5] = {3,21,31,2,32,1};
注意错误:
int a[3][4];
a[3] = {};
字符串
很多个字符组合在一起就是字符串了
初始化
char a[] = “123”; 和 char a [] = {‘1’,’2’,’3’};的区别,可以比较大小
“123”其实是由’1’、’2’、’3’、’\0’组成
“123”的存储分布
字符串的输出”%s”,’\0’是不会输出的
\0的作用
‘\0‘是一般字符串语句中的结束符号,可以判断字符串是否结束
字符串数组
初始化
char names[2][10] = { {‘J‘,‘a‘,‘y‘,‘\0‘}, {‘J‘,‘i‘,‘m‘,‘\0‘} }; char names2[2][10] = { {"Jay"}, {"Jim"} }; char names3[2][10] = { "Jay", "Jim" };
指针
定义格式 类名标识符 *指针变量名; 如 int *p;
先定义后赋值
// 简单取值 int a = 10; int *p; p = &a; printf(“%d”, *p); // 简单改值 *p = 9;
定义的同时赋值
int a = 10; int *p = &a;
清空指针
p = 0; p = NULL;
指针与数组
1、指向数组元素的指针与普通指针变量一样,例如
int a[5]; int *p=&a[0]; p=a; //数组名代表数组的首地址 p=&a[1];//指针指向第二个元素
在数组里面,通过*(p+1)、*(p-1)就可以直接获取上下元素。
2、指针下标:在C语言中,中括号[]是下标运算符,一般我们习惯用数组名[下标]对数组元素进行访问,实际上,下标运算符可用于指针运算,例如:
int a[4]; int *p=&a[1]; //指针p指向数组的第二个元素
p[1] --> *(p+1) 下一个元素,即a[2]
p[-1] --> *(p-1) 上一个元素,即a[0]
下标运算符:D[N]没有规定D和N的顺序,N[D]也是可以的,例如:
1[p] --> *(1+p)
(p+1)[1] --> *(p+1+1) //用的人少
3、访问数组元素的4种方式: a[i]、 *(a+i)、p[i]、*(p+i)
#include <stdio.h> int main(){ int x[] = {1,2,3}; int s=1,i,*p=x+2; //*p = &x[2] for(i=2;i>=0;--i) s -= (-i)[p]; // (-i)[p] = *(-i+p) 1-1=0 0-2=-2 -2-3=-5 printf("%d\n",s); // -5 return 0; //1[p] --> *(1+p) }
原文:http://www.cnblogs.com/melodyzhy/p/4623281.html