笔试复习_C++_指针(二)

来源:互联网 发布:蓝月传奇官印升级数据 编辑:程序博客网 时间:2024/06/05 14:12

指向字符的指针

指向字符的指针是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。
赋值方法(字符串指针方式和数组方式):

char str[]="I love CHINA!";char *str="I love CHINA!";char str1[40]="hello world!";    //这是初始化,并非赋值

只能对字符数组的各元素逐个赋值,不能写为:

 char str1[40]; str1[40]="hello world!";

定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义的同时赋值给指针一个字符串常量进行初始化。初始化指针时所创建的字符串常量被定义为只读,存放在常量区,不可以修改字符串的值。但是通过数组初始化的字符串则可以修改。

char * a = "hello";

&a 表示a的地址 ,a 是一个指针, 这个指针指向的内容是char类型的, 所以这个指针的加减运算a+1 表示地址加1字节。

char * a = "hello";char ** b = &a;

b是一个指针, 这个指针指向的地址存储的是 char * 类型的数据。b + 1 表示地址加8字节(64位系统)。

char *a[10] = {"hello", "world"};

char *a[]
表示 a是数组, 数组中的元素是指针, 指向char类型
a表示a数组第一个元素存储的地址。a+1是第二个元素地址。*(a+1)是第二个元素值。
&a也是数组a所在的地址。等于a。
但是(&a)+1不等于a+1.因为a指向数组第一个元素,所以a+1指向第二个元素。而&a指向数组,所以(&a)+1指向数组最后一个元素的下一个元素。
*(a+1) 则表示a这个数组的第二个元素的内容 (是个char 类型的指针)。
*(*(a+1)) 则表示a这个数组的第二个元素的内容(char指针)所指向的内容(字符)。

char a[2][10] = {"hello", "world", "linux"};

char a[2][10] 表示一个二维数组, 存储在最底层的元素是char。
char a[2][10] 中,a+$n 或者 & a[n] 表示 指向1维的第$n个元素的指针, *(a+$n)+$m 或 & a[n][m] 表示指向1维的第n个元素中的第m个元素的指针。
*(*(a+$n)+$m) 或者 a[n][m] 表示 1维的第n个元素中的第m个元素 的内容 。
&a 是一个指针, 加1 将加整个二维数组所占空间,相当于加20字节。
a 是一个指针,加1 将加加1个1维元素所占空间,相当于加10字节。a+1与*(a+1)相等。
*a 是一个指针 , 加1 将加加1个2维元素所占空间,相当于加1字节。
**a 不是指针,是char。
当char []作为函数的参数时,表示 char *,当作为函数的参数传入时,实际上是拷贝了数组的第一个元素的地址 。
char * a 和 char a[] 都是指针, 指向char类型,char a[] 把内容存在stack; char *a 则把指针存在stack,把内容存在constants。
char * a[10] 和 char a[10][20]都是2级指针,a 表示一级指针,**a 表示内存中存储的内容。char a[10],数组由char * 类型的指针组成;char a [10][20] 表示一位放10个元素, 二维放20个元素, 值存放地是一块连续的内存区域,没有指针。
[]和*的数量对应, 如 char a[][]的指针层数是2, 相当于char **a; char *a[]也是如此。

例题:
1.下述程序的输出是__

#include<stdio.h>int main(){    static char *s[] = {"black", "white", "pink", "violet"};    char **ptr[] = {s+3, s+2, s+1, s}, ***p;    p = ptr;    ++p;    printf("%s", **p+1);    return 0;}

解:
首先 s是一个指针数组, 存的是字符串的首地址。 char **ptr[] 也是指针数组,存放二级指针。p是一个三级指针,ptr这个二级指针数组的数组名也是一个三级指针。
p = ptr
++p
所以 *p = ptr[1] =s+2
**p =&(s+2 )= &”pink”
**p + 1 = &”ink”
结果为ink。

原创粉丝点击