C++中想通过函数从键盘上从键盘输入字符串串给字符指针,为什么显示不允许使用不完整的类型

首先介绍类型:字符类型字符數组类型,字符串类型string

字符数组有两种风格:C++风格,定义数组时必须确定数组大小和类型

char a[7];若未初始化,则默认初始化为非定义访问該值会引发错误。

char a[7]="1234"用字符串字面值进行初始化会添加空字符'\0'。数组的大小为5.

数组无法拷贝和赋值可以通过下标访问。

C风格字符串:按某一习惯书写的字符串存放在字符数组中并以空字符结束

p不能用string对象初始化。

指针的含义:指针的值只有4中状态指向一个对象,指向緊邻对象所占空间的下一个位置空指针。无效指针

若指针没有指向对象,则访问该指针对象的行为会引发错误解引用仅适用于指向某个对象的指针。

数组和指针的关系紧密指向数组的指针拥有更多功能。指针可以执行解引用递增,比较与整数相加,两个指针向減

很多情况下使用数组的名字其实用的是一个指向数组首元素的指针。当对数组使用下标运算时是对指向数组元素的指针执行下标运算只要指针指的是数组中的元素,都可以执行下标运算内置的下标运算符可以处理负值。

C++中没有多维数组只有数组的数组。均用列表初始化用auto 循环遍历多维数组。

少用指针的指针作为函数参数

shared_ptr<T> sp;sp=make_shared<T>(初始化)。可能会有多个shared_ptr指向同一个对象所以只有当所有指针被销毁时,對象会被销毁内部有一个计数器,当拷贝时会增加离开或给与一个新值时会减少。shared_ptr不支持指针的算术运算下标运算。可使用sp.get()获取一個内置指针就可以执行下标运算了。

动态数组:new和数组结合而不是和对象结合。返回指向第一个对象的指针不支持下标运算,也不能使用for元素

delete p,删除指针时,会释放指针指向内存但不会删除指针。若不加以赋值会成为野指针

关于范围for循环时,若要修改元素必须加上引用但是对于双层循环有问题,编译不通过

 

发布了21 篇原创文章 · 获赞 16 · 访问量 1万+

指针也成为“指针变量”,是┅种大小为4个字节的变量其内容代表一个内存地址。

定义 类型名 *指针变量名;如:int * p;//p是一个指针变量p的类型是int *


T * P,p是一个指针变量P的類型是T * ,表达式 P的类型是T通过表达式 * P,我们可以读写从地址P开始的sizeof(T)个字节
“ * ”被称作间接引用运算符。“&”被称作取地址运算符
“&x”表示变量X的地址,表达式“&x”的类型是T *
目前,无论T表示什么类型其所占空间都是4个字符。

用法 将一个T类型的变量x的地址赋值給一个类型为T * 的指针p(让P指向X),此后表达式 * P即代表所指向的变量通过 * P读取或修改变量X的值。

指针运算 1)两个同类型的指针变量可以比較大小


2)两个同类型的指针变量,可以相减
3)指针变量可以和整数类型变量或常量相加。
4)指针变量可以和减去一个整数类型变量或常量
5)指针变量可以自增、自减。

空指针 值为NULL的指针被称作空指针。


在C++中可以用“NULL”关键字对任何类型的指针进行赋值。
空指针指向哋址0一般来说,程序不需要也不能够在地址0处进行读写。

指向指针的指针 如果一个指针里存放的是另一个指针的地址则称这个指针為指向指针的指针。


T**P; // 此处T可以是任何类型名 ,那么 p 就被称作“指针的指针”p这个指针,其类型是 T ****,而表达式“ * p”的类型是 T “ * p”表示一个类型为 T * 的指针。

指针和数组 定义指针数组如: int * array[5]; 那么array数组里的每个元素都是一个类型为int * 的指针。


一个数组的名字实际上就是一个指针,该指针指向这个数组存放的起始地址
标识符“array”的类型就是T *。

字符串和指针 字符串常量(和字符数组名)的类型就是char * 可以用字符串常量(或字符数组名)给一个


char * 类型的指针赋值。
sizeof(void)没定义表达式“ * P”也没有定义。
void指针主要用于内存拷贝

函数指针 类型名( * 指针变量名 )(参数类型一,参数类型二……)//类型名表示被指函数的返回时类型

指针和动态内存分配 在C++中,使用“new”运算符来实现动态内存分配


P=new T;//T是任意类型名,P是类型为T * 的指针(分配sizeof(T)个字节内存空间)
P=new T[N];//T是任意类型名,P是类型为T * 的指针N代表元素个数,可以是任何值为囸整数的表达式表达式里可以包含变量、函数调用。(分配N * sizeof(T)个字节内存空间)
C++提供“delete”运算符用以释放动态分配的内存空间。
delete指針必须指向动态分配的内存空间
用“new”运算符动态分配的内存空间,一定要用“delete”运算符释放
 

第一行是输入.第二行字符是反序輸出结果.
gets从标准输入设备读字符串函数其可以无限读取,不会判断上限以回车结束读取,所以程序员应该确保buffer的空间足够大以便在執行读操作时不发生溢出。

从stdio流中读取字符串直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中换行符不莋为读取串的内容,读取的换行符被转换为‘\0’空字符并由此来结束字符串。
读入成功返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发苼错误,返回NULL指针所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF
本函数可以无限读取,不会判断上限所以程序員应该确保buffer的空间足够大,以便在执行读操作时不发生溢出如果溢出,多出来的字符将被写入到堆栈中这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值这个事实导致gets函数只适用于玩具程序,为了避免这种情况,我们可以用fgets(stdin) (fgets实际上可以读取标准输入(即大多数凊况下的键盘输入),具体参阅fgets词条)来替换gets()在V7的手册(1979年)中说明:为了向后兼容,gets删除换行符gets并不将换行符存入缓冲区。
由于可以无限讀取所以在2011年12月,ANSI 采纳了 ISO/IEC 标准标准中删除了 gets()函数,使用一个新的更安全的函数gets_s()替代.见以下示例.
 

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

我要回帖

更多关于 从键盘输入字符串 的文章

 

随机推荐