[C学习]指针与数组

来源:互联网 发布:阿里云解析有什么用 编辑:程序博客网 时间:2024/05/01 00:34

数组与指针比较:

a>非形参数组是指针常量,而不是指针变量.

b>形参数组名是指针变量.

应该说明:实参数组名代表一个固定的地址,或者说是指针常量,而形参数组并不是一个固定的地址.作为指针变量,在函数调用开始时,它的值等于实参数组起始地址,但在函数执行期间,它可以再被赋值.

作形参时,可以数组元素的个数,也可以不指定元素的个数.因为形参数组名实际上是一个指针变量,并不是真正地开辟一个数组空间.fun(int arr[],int n)在编译时,实际上将arr当作指针变量来处理,相当于                  fun(int *arr,int n)

如:pa=a+2;//right

      a=a+2//wrong

fun(int x[],y[][4]){}

这时x[]等价于*x;y[][4]相当于(*y)[4],

---------------------------------------------------

数组中,a[3],实际上在编译时,对数组元素a[i]都是处理成*(a+i),即按数组首地址加上相对位移量得到要找的元素的地址,然后找出该单元中的内容.而[]实际上一个变址运算符,即将a[i]按(a+i)计算地址,然后找出这个地址下的值.

指针如果用作实参,必须先使指针变量有一个确定的值,指向一个已定义的单元.

如:main(){int *p; f(p,10);}//错误,因为p没有确定值.

----------------------------------------------------

多维指针:

如:int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};

      a:两维数组的数组名,相当一个两级指针,指向元素个数为4的一维数组.

  a[0]:是a的一个元素,它又是一个一维数组,代表这个数组的首地址,地址是指向单个元素的--列

      a[1]:与a[0]相同,它指向a中第二个元素,地址偏移为   类型*元素个数 (2*4=8)

--第1行第0列的地址怎么表示?

  &a[1][0];

      *(a+1)+0;

      a[1];

注意:一维数组中,a[i]是有物理地址的,占内存单元;

   二维数组中,a[i]是逻辑上使用的,没有对应的内存地址.

  二数组名是指向行的,它的偏移数量是以行为单位的,a+1中的1所代表的一行中所有元素所占用的字节数

  在指向行的指针前面加一个"*",转换为指向列,而在列的指针前面加"&",就成为指向行的指针.

  即"*",由大指到小,由行到列,而"&"由小指到大,由列到行.

对指针赋值也要注意等级,如是一个二维数组,将首地址赋给一个指针,那么这个指针必须是一个二级指针.或者是指针数组.如(*p)[4];

--------------------------------------------------------

字符串与指针

字符串的表示:用字符数组来存放一个字符串,用字符指针指向一个字符串.

如:char *string ="I love China";

     printf("%s",string);

 %s是输出字符串所用的格式符,在输出项中给出字符指针变量名string,则系统先输出所指向的第一个字符数据,然后自动string+1,使之指向下一个字符..直到遇到字符串结束标志'/0'.对过字符串数组名或是字符指针变量名可以输出一个字符串,但对数值型数组,是不能用数组名来输出它的全部元素的

char *a;scanf("%s",a);//不正确,因为编译时虽然给a指定内存单元,a的地址(&a)是指定了,但a的值并没有指定,是一个不可预料的值.a中若是存放了指令或者别的有数据,那么会破坏程序.

原创粉丝点击