C基础课程笔记总结7-指针2:指针与字符串数组

指针2:指针与字符串数组

在OC中,指针与字符串数组的应用是真正需要掌握的知识点。

定义一个字符串,一般是通过定义一个字符数组来接收这个字符串,例如: char a[]="it';输出字符串可以这样操作: printf(“%s\n”,a)用%s来表示字符串,并且S检测的是对应的地址,然后输出该地址存储的值,而不是直接输出值,因此可以直接写对应字符数组名即可。

还有一种定义方法是用字符指针变量来定义一个字符串,例如:char *p="it";,此时,指针变量p的值只是指向了字符‘i’而已,即指向首字符的地址。而用指针定义字符串,只能在声明指针的同时定义字符串,在声明之后定义字符串会产生错误。

然而,这两种定义字符串的方法是完全不同的,

在C中,内存分为5个大块,1:常量区;2:堆;3:栈;4:?;5:?;

1:常量区:用于存放常量,常量去的变量值只能写入一次,之后不可更改,并且还会缓存起来,再次用到该常量时,还会返回同一个值。

2:堆:用于存放对象。

3:栈:用于存放局部变量,变量的值可以自由改动。

数组存放在栈内存中,因此,用数组定义的字符串存放在栈内存中,可以随意更改,而用指针定义的字符串存放在常量区中,不可更改。

对于经常使用但是无需更改的字符串可以用指针定义,可以节省内存空间提高性能,因为频繁的开辟和消除内存空间是非常消耗性能的,而需要改动的字符串必须用数组定义


指针数组,数组中所存储的元素都是指针变量,定义指针数组和定义一般数组都是一样的: 数据类型 +数组名,而指针的数据类型 是指向类型+*号,如下

char *point[100];

即定义了一个指针数组,而指针是可以定义字符串的,因此指针数组中的元素可以直接写成:

char *p[]={"abc","def","jdajflad","dkddk".........}

数组中的每一个指针都指向了一个常量的字符串,但要注意的是,输出其中的字符串内容是,在数组名前不用在加上*号,直接写数组名加下标即可输出对应字符串,如

p[0]=abc,

因为在指针数组中,存放的元素就是指针,不用再次说明,因此在输出时,并不用再加上“*”号

如果写成:*p[0]的话,会发生错误。因为对于指针数组而言,每个元素的都是指针

对于需要改变的字符串数组,可以用普通的二维数组定义法来定义,例如

char name[3][20],

该字符二维数组可以存放3个字符串,每个字符串最多能有20个字符。


字符串的输入:对于字符串的输入,系统不能提前知道用户将输入多少个字符,只能规定最大输入字符个数,因此,用户输入的字符串是可变的,必须用字符数组定义。

首先定义一个字符数组,

char a[2]

表示这个数组可以有两个字符串,并不是说每个字符串只能有两个字符

然后用scanf函数进行输入,使用scanf函数,系统会自动在最后一个字符之后加上字符串结束符“\0”,scanf也不限制输入,但是输出有限制。.

而使用gets()函数,则会不限制输入的字符个数,尽管在定义数组时有限制,但是在实际输入中,不论输入多少都能显示,并且也会自动加\0.


但在实际使用中,多用gets()


指针与函数:

1.返回指针的函数

函数都可以有返回值,因此也可以返回一个指针变量,返回类型在写在函数名之前,例如 int function(),所以,返回指针的函数写为

char *function(),

其中 char * 表示返回的类型,是一个指针,指针即指向地址,所以返回的实际是一个地址值。

2.指向函数的指针:

指针能够指向函数,说明函数也有自己的地址值,因为函数是放在内存中的方法区中,这个知识点在OC中不常使用。

声明函数指针的固定格式:

所指向函数的返回类型 (×p)(所指向函数的参数,参数变量名不写),p表示指针变量名,可以任意取名,(*p)括号表示这个指针是指向一个函数的指针,其实就是把函数名换成(*p)

赋值格式:

p=所指向的函数名;不用写函数的参数

和数组一样,数组名即地址,函数名也是地址

调用函数指针的方式:

(*p)(函数参数)=p(函数参数)=function(函数参数);

也和数组类似。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值