C语言中指针,数组,字符串及函数

1 指针与数组:

1.1 普通指针定义(例如整型):

int *p;
普通指针如果要在定义时赋初值注意:
应采用 int *p=&i;形式,因为是在定义指针变量的时候给指针赋值,故右值也要是指针。

1.2 数组与指针:

首先说下C语言里面数组名做实参和形参的问题,

1.数组名做函数参数,传递的是数组的首地址,也就是说形参数组和实参数组从此指向了同一段内存。

2.C语言编译时对形参数组大小不做检查,只是将实参数组的首元素的地址传递过去。

3.最关键的一点,实参数组名其实是一个指针常量指向数组的首元素,而形参数组名是一个指针变量,初值和传递过来的实参数组首元素地址相同。见下程序:

void main()

{

void f(int arr[ ], int n);

int array[10];

...

f(array,10);

...

}

注意红色的函数声明部分,编译时实际是将形参数组名arr当成指针变量处理,也就是类似f(int *arr, int n)来处理,那么在f函数本体内,显然可以直接将形参数组名当成一个指针常量来是用来了,它的初值是实参数组的首元素地址。

所以f函数内必然可以使用int *p=arr;来定义一个指向数组首元素的指针,然后也可以用诸如*(p++),*(arr++)或者p[i]或者arr[i]来访问数组元素了。

1.3 多维数组与指针:

永远记住,C中的数组名就是指向本数组首元素的指针,这一点是无条件等价的。
只是针对多维数组来说,例如二维数组a[ ] [ ],a只是针对到a[0], a[1], a[2]这三个元素,无法针对到内层地的a[1] [2]这种,也就是说
a, a+1, a+2这种分别是第一行第二行第三行首地址,也就是a[0] a[1] a[2]这三个元素的地址。
a[0] a[1] a[2] *a *(a+1) *(a+2)这些则是一行二行三行首元素地址

1.4 指针数组

2 字符串与指针

C语言中,对字符串的处理有两种,字符数组和字符指针。

2.1 字符数组

字符数组不用多说,需要注意的就是结尾的结束符 \0,下面列出一些比较常用的处理代码:
char string[ ]="....";
注意这里的初始化绝对不能写成
char string[14];
string="....";
因为string数组名是一个指针常量,这样对常量再次赋值必然非法。
如果想要改变string数组里面的内容,必须通过一个一个改变数组元素来实现,因为C语言对于数组的整体赋值只有在定义数组的那一次同时整体赋值才可以。之后想要整体赋值必然需要用到数组名,但数组名为指针常量,当然不能被再次赋值。
C语言中对于数组的限制很多,但是数组也并非一无是处,例如排序这些操作,显然是需要用到数组这种线性表的数据结构的。

2.2 字符指针

2.2.1 基本用法

从字符指针赋初值就能看出字符指针处理字符串时的便利
例子:
char *string=".....";
string="......";
printf("%s",string);
或者
char *string;
string="......";
sring="......";
printf("%s",string);
可以看到string是一个字符指针变量,故它可以被重复赋值,如

2.2.2 常见错误

char *a;
scanf("/s",a);
错误点在于a这个字符指针变成了一个乱指的指针,编译系统看到char *a只是给指针a分配了一个固定的内存单元,但是a指向何处(也就是a这个内存单元里面的数值)却不固定,因此如果贸然对a指向的地方进行赋值可能会破坏了程序甚至系统。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值