字符串和指针
访问一个字符串有三种方法:
1、用字符数组存放一个字符串
char str[]="hello world!";
2、用字符串变量存放字符串
string str="hello world!";
3、用字符指针指向一个变量
char *str="hello world!"
对字符指针变量str初始化,实际上是把字符串中第1个字符的地址赋给str。在输出时,系统先输出str所指向的第一个字符数据,然后使str自动加1,使之指向下一个字符,然后再输出一个字符,如此直至遇到字符串结束标志'\0'为止。
在内存中,字符串的最后被自动加了一个'\0',因此在输出时能确定字符串的终止位置。
例1:将字符串str1复制为字符串str2。
#include <iostream>
using namespace std;
int main()
{
char str1[] = "hello world!";
char str2[15], * p1, * p2;
p1 = str1;p2 = str2;
for (; *p1 != '\0'; p1++, p2++)
*p2 = *p1;
*p2 = '\0';
p1 = str1; p2 = str2;
cout << "str1 = " << p1 << endl;
cout << "str2 = " << p2 << endl;
return 0;
}
//结果为:
str1 = hello world!
str2 = hello world!
函数与指针
指针变量也可以指向一个函数,一个函数在编译时被分配一个入口地址,这个函数入口地址就称为函数的指针,可以用一个指针变量指向函数,然后通过该指针变量调用此函数。
指向函数的指针变量的一般定义形式为
函数类型 (*变量名)(函数形参表)
例2:求a和b中的大者。
#include <iostream>
using namespace std;
int main()
{
int max(int a, int b); //声明函数
int (*p)(int x, int y); //定义指向函数的指针变量p
int a, b, m;
p = max; //使指针变量p指向函数max
cout << "请输入a和b:";
cin >> a >> b;
m = p(a, b); //使用指针变量调用函数max
cout << "大者为:" << m << endl;
return 0;
}
int max(int a, int b)
{
int c;
if (a > b) c = a;
else c = b;
return c;
}
结果如下:

void指针类型
可以定义一个基类型为void的指针变量,它不指向任何类型的数据。不要把“指向void类型”理解为能指向任何类型的数据,而应理解为指向空类型或不指向确定的类型的数据。
如果指针变量不指向一个确定的数据类型,它是无法访问任何一个具体的数据的,它只提供一个地址。在C中用malloc函数开辟动态存储空间,函数的返回值是该空间的起始地址,由于该空间尚未使用,表示它不指向确定的具有类型的数据,显然这种指针是过渡型的,它必须转换为指定一个确定的数据类型的数据,才能访问实际存在的数据,否则它是没有任何用处的。
在实际使用该指针变量时,要对它进行类型转换,是指适合于被赋值的变量的类型。
需要注意的是,可以把非void型的指针赋给void型指针变量,但不能把void指针直接赋给非void型指针变量,必须先进行强制转换。
指针运算小结
1、指针变量加减一个整数
一个指针变量加减一个整数是将该指针变量的原值和它指向的变量所占用的内存单元字节数相加或相减。如p+i代表p+i*d,d为p所指向的变量单元所占用的字节数。
2、指针变量赋值
将一个变量地址赋给一个指针变量
3、指针变量可以有空值,即该指针变量不指向任何变量,可以表示为:p=NULL;
4、两个指针变量可以相减
如果两个指针变量指向同一个数组的元素,则两个指针变量之差是两个指针之间的元素个数,但是两个指针变量之和并无实际意义。
5、两个指针变量比较
若两个指针指向同一个数组的元素,则可以进行比较,指向前面的元素的指针变量小于指向后面元素的指针变量,如果两个指针变量不指向同一数组,则二者的比较是无意义的
6、对指针变量的赋值应注意类型问题
对不同类型的指针变量不能直接赋值,需要进行强制类型转换成同一类型后才能进行赋值操作。
1549

被折叠的 条评论
为什么被折叠?



