C语言-指针的基础学习笔记(2)

3、字符串与指针

(1)字符串数组存放一个字符串,char  string[ ] = "c language!";  printf("%s\n", string)。此处是,一个数组名,代表字符数组的首元素的地址。

(2)字符指针指向一个字符串,char *string = “c language!”; printf(“%s\n”, string),其等价于char *string; string = “c language!"; string此处不是一个字符串变量,而是被定义成一个指针变量,指向字符型数据。不是把“c language!”这些字符存放到到string中(指针变量只能存放地址),也不是把字符串赋给*string,只是把字符串的第一个字符的地址赋给指针变量string。

(3)用%s可以对一个字符串进行整体的输入输出,即在输出字符串的时候,系统先输出字符指针变量名string指向的一个字符数据,然后自动使string加1,使之指向下一个字符,直到遇到字符串结束标志‘\0’位置,在内存中,字符串的最后被自动加了一个‘\0’。

(4)a、字数数组是由若干元素组成的,每个元素中存放一个字符,而字符指针中存放的是地址(字符串第一个字符的地址),b、赋值:对于字符数组只能对各个元素赋值,char str[14] = {"c language!" },不能等价于char str[14]; str[] = "c language!"。即可以在定义时整体赋初值,但是不能在赋值语句中整体赋值。对于字符指针变量,char * a;a=“c language!”是可以的,等价于char * a = “c language!”。c、如果定义了一个字符数组,在编译时就为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址,就是说,该指针变量可以指向一个字符型数据,但是如果没有对其赋地址值,则其并没有具体指向一个确定的字符数据。所以char str[10]; scanf("%s", str)是可以的,而char *a;scanf("%s",a);是可以运行,但是是危险的,因为a的值是不可预料的,它可能指向内存中空白的用户存储区,也可能指向已经存放指令或数据的内存段,这就破坏的程序,甚至破坏了系统。char *a,str[10]; a=str; scanf("%s", a); 这样是可行的。d、指针变量的值是可以改变。e、字符串在内存中是以字符数组的形式存放的。

4、指向函数的指针,指针数组,指向指针的指针

(1)一个函数在编译时被分配一个入口地址,这个地址就是函数的指针。每一个函数都占用一段内存单元,他们都有起始地址,因此可以用一个指针变量指向一个函数,通过指针变量来访问它指向的函数。如:

main(){ max(int x, int y){ main(){

int max(int, int);                            int z; int max(int,int);

int a, b, c; if(x>y) z=x; 可以将main函数改为: int (*p)();

scanf("%d %d %d", &a, &b,&b); else z =y; int  a,b,c; .....

c = max(a,b);} return z;} c = (*p)(a,b); }

int (*p)()定义p是一个指向函数的指针变量,次函数返回整型的返回值,前面的()不能省,p先与*结合是一个指针变量,然后和()结合表示指针变量指向函数。如果是int * p()则变成了声明一个函数,返回值是一个指向整型变量的指针。

,在给函数指针变量赋值时候只需给出函数名而不必给出参数,使用函数指针变量调用函数时,只需将(*p)代替函数名即可,指向函数的指针变量,例如p++,p+n等都是无意义的。

函数指针变量常用的用途是把指针作为参数传递到其他函数。函数的参数可以是变量、指针变量、数组名、指向数组的指针变量、函数的指针等。

(2)一维指针数组的定义形式为:类型名  * 数组名[数组长度],由于[]比*的优先级高,p先与[4]结合表示有4个元素的数组,再与*结合,表示此数组是指针类型的,每个元素都(相当于一个指针变量)指向一个整型变量。它比较适合于用来指向若干个字符串,是字符串处理更加方便灵活。

(3)指向指针数据的指针变量简称指向指针的指针,定义一个指向指针数据的指针变量:char * * p;相当于char * (*p),其理解参考与二维数组的指针表示。

5、总结

不应该把整数赋值指针变量,也不应把指针变量的值(地址)赋给一个整型变量。指针变量可以有空值,即该指针变量不指向任何变量。可以表示为 p=NULL,两个指针变量可以相减,但是相加无任何意义。

还有一种void指针类型,即定义一个指针变量,但是不指定它是指向哪一种类型数据的。可以用来指向一个抽象的类型的数据,在将他的值赋给另一指针变量的时候进行强制类型转换,使之适合于被赋值的变量的类型。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值