1、字符指针、字符数组c++
1. 字符指针:字符串指针变量自己是一个变量,用于存放字符串的首地址。而字符串自己是存放在以该首地址为首的一块连续的内存空间中并以‘\0’做为串的结束。数组
char *ps="C Language"; 顺序是:1.分配内存给字符指针;2.分配内存给字符串;3.将字符串首地址赋值给字符指针;app
能够写为:函数
char *ps; #ps字符串指针,是指针,是一个变量,spa
ps="C Language"; #ps为字符串的首地址,利用ps++可遍历字符串,字符串存储在以ps为开始地址的地段连续的内存空间中,并以'\0'做为字符串的结束。指针
这里有两点须要考虑清楚的地方:①*a只是指向一个字符。举例以下:内存
1.#include <stdio.h>字符串
2.#include <stdlib.h>string
3.it
5.char *a= "bcd" ;
6.printf("输出字符:%c /n", *a); /*输出字符,使用"%c"*/<br>
printf("输出字符:%c /n", *(a+1) ); /*输出字符,使用"%c"*/
7.printf("输出字符串:%s /n", a); /*输出字符串,使用"%s";并且a以前不能有星号"*" */
8.system("pause"); /*为了能看到输出结果*/
9.}
10./*运行结果以下:
11.输出字符:b<br>输出字符:c
12.输出字符串:bcd*/
②若字符串常量出如今在表达式中,表明的值为该字符串常量的第一个字符的地址。因此”hello”仅仅表明的是其地址。原声明方式至关于如下声明方式:
1.char *a;
2.a="hello";/*这里字符串"hello"仅仅表明其第一个字符的地址*/
2. 字符数组:字符数组是因为若干个数组元素组成的,它可用来存放整个字符串。(即用字符数组来存放字符串)。
在c语言中,将字符串做为字符数组来处理。(c++中不是)
字符数组初始化的方法:
1). 能够用字符串常量来初始化字符数组:char str[]={"Iamhappy"}; 能够省略花括号
char str[]="Iamhappy"; #系统自动加入‘\0’
注意:上述这种字符数组的总体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值。
下面的赋值方法是错误的:
char str[20];
str="Iamhappy";
对字符数组的各元素逐个赋值。
char str[10]={'I','','a','m','',‘h’,'a','p','p','y'};
在C语言中,能够用两种方法表示和存放字符串:
(1)用字符数组存放一个字符串
char str[]="IloveChina";
(2)用字符指针指向一个字符串
char *str="IloveChina";
两种表示方式的字符串输出都用:printf(“%s\n”, str);
%s表示输出一个字符串,给出字符指针变量名str(对于第一种表示方法,字符数组名便是字符数组的首地址,与第二种中的指针意义是一致的),则系统先输出它所指向的一个字符数据,而后自动使str自动加1,使之指向下一个字符...,如此,直到遇到字符串结束标识符"\0"。
2、字符串指针
string* str能够赋值string* str = {"hello", "world"};//对比与char *name = "wang" = {'w','a','n','g'}
//?? *(str) = "hello", *(str+1) = "world"
//?? *(*(str)+1) = 'e',
也就是说每一个元素都是string类型的,跟char*是不同的,不过string*能够用char**来代替//string = char*, string* = char**
3、(字符串)指针数组
#include <stdio.h>
void main()
{
char *str[] = {"Hello", "C++", "World"};//char (*str)[] = ...
int i;
for(i=0; i<3; i++)
printf("%s\n", str[i]);
} #str[0]字符串“hello”的首地址,str[0]+1:字符串“hello”第二个字符‘e’的地址,str[2]=str+2:第三个字符串“world”的首地址
#str[1]字符串“C++”的首地址
#str[2]字符串“world”的首地址
或
#include <stdio.h>
#include <string.h>
void main()
{
char *str[] = {"Hello", "C++", "World"};
char **p;
for(p=str; p<str+3; p++)
puts(*p); #*p为字符串首地址,*p[0]为字符串的第一个字符地址
}
#include<stdio.h>
#include<stdlib.h>
main()
{
char *str[3]={"Hello","C++","World"};
printf("%s,%s,%c",str[0],str[0]+1,*(*(str+2)+1));
system("pause");
}
结果为:
Hello,ello,o
格式:char* na[N] = {"li", "zh", "li", "zh", "li"};
char *a[]:表示a是数组,数组中的元素是指针,指向char类型,(数组里面全部的元素是连续的内存存放的)
数组名是数组第一个字节的内存地址,而且数组名a也表示指针。因此a 并不表示a地址存储的内容, 而是a地址自己。
这是一个典型的数组名(或者说是指针数组)作函数参数的例子,并且仍是没有指定大小的形参数组。
有时为了再被调用函数中处理数组元素的须要,能够另设一个形参,传递须要处理的数组元素的个数。并且用数组名作函数实参时,不是吧数组元素的值传递给形参,而是把实参数组的首元素的地址传递给形参数组,这样两个数组久共同占有同一内存单元。 和变量做函数参数的做用不同。
能够去看看关于数组做为函数参数和指针数组做main函数形参方面的例子。谭浩强的那本书讲的很细,对这个有详细的解释。