指向字符串的指针数组

合集下载

c语言字符串数组定义的几种方式

c语言字符串数组定义的几种方式

c语言字符串数组定义的几种方式摘要:一、字符串数组定义1.方式一:使用char类型数组2.方式二:使用字符串指针数组3.方式三:使用字符串数组二、每种方式的优缺点分析1.方式一:使用char类型数组2.方式二:使用字符串指针数组3.方式三:使用字符串数组正文:C语言中,字符串数组的定义方式有多种,每种方式都有其特定的使用场景和优缺点。

以下将详细介绍这三种方式。

一、字符串数组定义1.方式一:使用char类型数组我们可以直接定义一个char类型的数组,然后将字符串的每个字符存储在数组中。

这种方式定义的字符串数组可以方便地处理单个字符串,但对于多个字符串的处理则较为繁琐。

例如:```cchar str1[] = "hello";char str2[] = "world";```2.方式二:使用字符串指针数组字符串指针数组是一个字符串指针的数组,每个元素指向一个字符串。

这种方式定义的字符串数组可以方便地处理多个字符串,且可以通过指针操作实现字符串的拼接、复制等操作。

例如:```cchar *str1 = "hello";char *str2 = "world";```3.方式三:使用字符串数组字符串数组是一个字符串的数组,每个元素都是一个字符串。

这种方式定义的字符串数组可以方便地处理多个字符串,且数组下标可以直接访问字符串的每个字符。

例如:```cconst char *str1[] = {"hello", "world"};```二、每种方式的优缺点分析1.方式一:使用char类型数组优点:- 存储字符串的每个字符,对于单个字符串的处理较为方便。

缺点:- 对于多个字符串的处理较为繁琐,需要手动处理字符串的拼接、复制等操作。

2.方式二:使用字符串指针数组优点:- 方便处理多个字符串,通过指针操作实现字符串的拼接、复制等操作。

c语言字符串数组定义的几种方式

c语言字符串数组定义的几种方式

C语言是一种被广泛应用于系统编程和嵌入式开发的编程语言,而字符串则是C语言中非常常见的数据类型。

在C语言中,字符串可以用字符数组来表示,而定义字符串数组的方式也有几种不同的方法。

1. 直接定义字符串数组直接定义字符串数组是最简单直接的方式,可以像定义其他数组一样来定义字符串数组。

例如:```Cchar strArray1[3][10] = {"Hello", "World", "C"};```在这个例子中,我们定义了一个包含3个字符串的数组,每个字符串的最大长度为10个字符。

通过直接赋值的方式,我们可以初始化这个字符串数组。

2. 逐个赋值如果不想在定义字符串数组的同时进行初始化,也可以通过逐个赋值的方式来初始化字符串数组。

例如:```Cchar strArray2[3][10];strcpy(strArray2[0], "Hello");strcpy(strArray2[1], "World");strcpy(strArray2[2], "C");```通过逐个赋值的方式,我们可以在定义之后再对字符串数组进行赋值操作。

3. 使用指针数组除了以上两种方式之外,还可以使用指针数组来表示字符串数组。

例如:```Cchar *strArray3[3] = {"Hello", "World", "C"};```在这个例子中,我们定义了一个包含3个指针的数组,每个指针指向一个字符串常量。

通过使用指针数组的方式,我们可以更加灵活地管理字符串数组。

总结回顾:通过以上几种方式的讨论,我们可以看到在C语言中定义字符串数组有多种灵活的方式。

无论是直接定义、逐个赋值还是使用指针数组,都可以让我们在不同场景下更好地处理字符串数组。

在实际的编程过程中,我们可以根据具体情况来选择合适的方式来定义字符串数组。

数组字符串和指针

数组字符串和指针
str2";
字符串连接函数strcat
• 将两个字符串连接成一个字符串
–char str1[30]={"Hello"}; –char str2[]={"World!"}; –cout<<strcat(str1,str2);
指针
•指针的定义 •使用简单的指针 •指针和数组 •指针和字符串
•指针数组 •多重间接访问 •指针、数组与函数 •main函数的参数
使用指针访问字符数组,大写字符 和小写字符之间相互转换
指针和字符串
• 在C++中,要访问一个字符串可以采用两种方
法 –使用字符数组; –使用指向字符的指针来指向一个字符串
将一个字符串反向输出
指针数组
• 如果一个数组中所有的元素都是同一种类型
的指针,那么这个数组就是一个指针数组 –int *p[10];
数组中每个元素都有自己的地址,并且这些地址是相连的。 这样,如果可以得到一个数组中某个元素的地址,又知道 这个数组中每个元素的数据类型,那么就可以通过一个指 针和在这个指针上进行的算术运算访问到这个数组中的所 有元素。
• 可以说访问数组元素的方法有两种
–一种是使用下标法访问数组元素, –一种方法是使用指针法访问数组元素 –使用指针法访问数组元素的效率要高于下标法。
字符数组来表示字符串
• C++要求在字符串的末尾增加一个字符的空间
用于保存一个字符串结束标记\0。 –要用字符数组来保存字符串时,要定义一个一维
字符数组,让这个字符数组的长度比要保存的字 符串的字符数目多1个,这样就有足够的空间保存 字符串中的所有有效字符和字符串结束标记\0
字符串输入函数gets

指向字符串的指针

指向字符串的指针
char ch[6] = "Hello";
cout<<"字符数组的长度为:"<<strlen(ch)<<endl;
Character string(p,ch);
string.display();
string.display1();
return 0;
}
/*
在VC++6.0中的输出结果为:
/*
功能:测试字符串指针的应用
注意字符数组与字符串指针的区别:
字符数组名是个静态的地址,指向数组的首地址(也就是第一个元素的地址)
字符串指针则是动态的,也指向字符串的首地址
char * p;
p = "Hello" //实际上就是将字符串Hello的首地址赋给指针变量P;
在输出时:cout<<p<<endl;//p代表整个字符串
cout<<&p<<endl; //输出为:指针变量p的地址
cout<<*p<<endl; //输出为:H
cout<<p+1<<endl; //输出为:ello,p+1 为从第二个字符的地址
cout<<&(*p)<<endl; //输出为Hello &(*p)等价于p
{
this->p = p;
for(int i=0;i<6;i++)
ch[i] = ch1[i];
}
void display()
{

指针与字符串

指针与字符串

字符串与指针字符串、字符数组与字符指针用字符数组存放个字符串然后输出该字符串(1) 用字符数组存放一个字符串,然后输出该字符串。

int main(){char str [ ]=”Hello World”;printf(″%s\n″,str);return 0;H e l l o W o r l d \0str[0]str[10]……}(2) 用字符指针指向一个字符串。

int main(){char *str=″ Hello World″;i tf(″%\″t )str[ 0]str[ 10]/*定义一个字符指针,指向字符串中的字符。

*/ printf(″%s\n″,str);return 0;}H e l l o W o r l d \0*str对比两种方法,将字符串a复制为字符串b。

main()/*字符数组方法*/字符串与指针int main( ) / 字符数组方法/{char a[ ]=″I am a boy.”,b[20];int i;for(i=0;*(a+i)!=‘\0’;i++) *(b+i)=*(a+i);*(b+i)=’\0’;(b+i)=\0;printf(″string a is :%s\n″,a);printf(″string b is:″);for(i=0;*(b+i)!=‘\0’;i++)printf(″%c″,b[i]);return 0;return 0;}int main()char a[]=″I am a boy ″b[20]*p1*p2;/*字符指针方法*/字符串与指针{char a[ ] =I am a boy. ,b[20],p1,p2;/ 字符指针方法/int i;p1=a;p2=b;for(;*p1!=′\0′;p1++,p2++)*p2=*p1;*p2′\0′*p2=′\0′;printf(″string ais:%s\n″,a);printf(″string bis:″);for(i=0;b[i]!=′\0′;i++)printf(″%c″,b[i]);i f(″\″)printf(″\n″);return 0;}程序必须保证使p1和p2同步移动字符串与指针对比字符数组与字符指针字符数组字符指针变量存储内容由若干个元素组成,每个元素中放一个字符存放的是地址(字符串第1个字符的地址)赋值方式只能对各个元素赋值或:char str[14]=“I am a boy;char *a=″I am a boy!″;或:char *a;a=″I am a boy!″编译时分配内存单元定义字符指针变量时分配内分配内存编译时分配内存单元,有确定的地址定义字符指针变量时,分配内存单元,在其中可以放一个字符变量的地址。

字符数组与字符指针

字符数组与字符指针

1.字符指针可以指向一个字符串。

我们可以用字符串常量对字符指针进行初始化。

例如,有说明语句:char *str = "This is a string.";是对字符指针进行初始化。

此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址。

这里要注意字符指针与字符数组之间的区别。

例如,有说明语句:char string[ ]="This is a string.";此时,string是字符数组,它存放了一个字符串。

字符指针str与字符数组string的区别是:str是一个变量,可以改变str使它指向不同的字符串,但不能改变str所指的字符串常量。

string是一个数组,可以改变数组中保存的内容。

2.实例:char *str, *str1="This is another string.";char string[100]="This is a string.";则在程序中,可以使用如下语句:str++; /* 指针str加1 */str = "This is a NEW string."; /* 使指针指向新的字符串常量*/str = str1; /* 改变指针str的指向*/strcpy( string, "This is a NEW string.") /* 改变字符串的的内容*/strcat( string, str) /* 进行串连接操作*/在程序中,不能进行如下操作:string++; /* 不能对数组名进行++运算*/string = "This is a NEW string."; /* 错误的串操作*/string = str1; /* 对数组名不能进行赋值*/strcat(str, "This is a NEW string.") /* 不能在str的后面进行串连接*/strcpy(str, string) /* 不能向str进行串复制*/3.其它说明:1) 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写:"abc",那么编译器帮你存储的是"abc\0"2) "abc"是常量吗?答案是有时是,有时不是。

c语言指针数组经典题目详解

c语言指针数组经典题目详解

c语言指针数组经典题目详解指针数组是一个数组,其元素都是指针。

C语言中,指针数组经常用于存储一组字符串或一组指向不同类型对象的指针。

下面是一些经典的题目,对指针数组进行详细解析。

题目1:将一个字符串数组按字典排序。

解析:首先,我们声明一个指向字符串的指针数组,将字符串数组的每个元素赋值给指针数组的对应元素。

然后使用冒泡排序法对指针数组进行排序,最后按照排序后的顺序打印指针数组元素所指向的字符串。

```c#include <stdio.h>#include <string.h>#define MAX_LENGTH 100#define MAX_NUM 10void bubbleSort(char* arr[], int size) {for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - 1 - i; j++) {if (strcmp(arr[j], arr[j+1]) > 0) {char* temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}}int main() {char* strings[MAX_NUM] = {"dog", "cat", "apple", "banana", "elephant", "fish", "goat", "zebra", "horse", "tiger"};int size = sizeof(strings) / sizeof(strings[0]);bubbleSort(strings, size);for (int i = 0; i < size; i++) {printf("%s\n", strings[i]);}return 0;}```题目2:将一个整数数组按升序排序。

上机实验十一 指针字符串指针数组二级指针

上机实验十一 指针字符串指针数组二级指针

上机实验十一指针、字符串、指针数组、二级指针学号: 姓名:一、目的要求:1.掌握数组元素、数组名、指针作为函数参数的用法以及区别2.学会使用字符串的指针和指向字符串的指针变量。

3.掌握字符串的两种表示法:一维字符数组和指向字符串的指针。

4.掌握字符串数组的两种表示法:二维字符数组和指向字符串的字符指针数组。

5.学会使用指针数组、二级指针来处理字符串数组。

二、实验内容:第1题、参照P224自定义strcpy、strcat、strcmp和strlen函数,要求分别用字符数组和字符指针实现,并编写合适的主函数测试函数是否正确。

第2题、编制函数del_char,函数原形为void del_char(char *a,char ch),函数的功能是删除a指向的字符串中的值为ch的字符。

例如从字符串"AscADef"中删除'A'后,字符串为"scDef"。

第3题、编写一函数实现删除字符串中重复的字符(函数中使用指针处理字符串),在主函数中输入一字符串然后调用函数实现删除字符串中重复出现的字符。

第4题、在字符串S中查找某个字符C,若包含则打印该字符在字符串中首次出现的位置,若不包含给出找不到信息。

第5题、练习指针数组:有三个字符串“Data structure”、“Coputer design”、“C Progrom”,请按字符顺序输出这三个字符串。

(要求用指针数组、二维字符数组和二级指针三种方法实现。

可参考P234例10-13和P236例10-15)第6题、下面程序中函数fun的功能是:把一个整数各位上的数转换成对应的数字字符,并按逆序输出。

例如:输入256,输出的字符为6 * 5 * 2 *。

请改正函数fun中的错误,上机调试使其能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

第7题、编一个函数int fun(* char ss),它的功能是:把ss字符串中的字符按逆序存放。

指向字符串的指针

指向字符串的指针

10.4符串的指针指向字符串的针指变量10.4.1 字符串的表示形式在C语言中,可以用两种方法访问一个字符串。

1) 用字符数组存放一个字符串,然后输出该字符串。

【例10.24】main(){char string[]=”I love China!”;printf("%s\n",string);}说明:和前面介绍的数组属性一样,string是数组名,它代表字符数组的首地址。

2)用字符串指针指向一个字符串。

【例10.25】main(){char *string=”I love China!”;printf("%s\n",string);}字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的。

只能按对指针变量的赋值不同来区别。

对指向字符变量的指针变量应赋予该字符变量的地址。

如: char c,*p=&c;表示p是一个指向字符变量c的指针变量。

而: char *s="C Language";则表示s是一个指向字符串的指针变量。

把字符串的首地址赋予s。

上例中,首先定义string是一个字符指针变量,然后把字符串的首地址赋予string(应写出整个字符串,以便编译系统把该串装入连续的一块内存单元),并把首地址送入string。

程序中的:char *ps="C Language";等效于:char *ps;ps="C Language";【例10.26】输出字符串中n个字符后的所有字符。

main(){char *ps="this is a book";int n=10;ps=ps+n;printf("%s\n",ps);}运行结果为:book在程序中对ps初始化时,即把字符串首地址赋予ps,当ps= ps+10之后,ps指向字符“b”,因此输出为"book"。

c++数组字符串指针

c++数组字符串指针
1
目录
8.1 数组 8.2 字符串 8.3 指针 8.4 小结
8.1 数组
2
数组的概念
• 数组是具有一定顺序关系的若干相同类型变量的 集合体,组成数组的变量称为该数组的元素。 • 数组属于构造类型。
8.1 数组
3
8.1.1 数组的声明与使用
• 数组的声明
类型说明符 数组名[ 常量表达式 ] [ 常量表达式 ]„„ ;
8.1 数组 —— 8.1.4 对象数组
25
例8-5 (续)
//6-3.cpp #include "Point.h" #include <iostream> using namespace std; int main() { cout << "Entering main..." << endl; Point a[2]; for(int i = 0; i < 2; i++) a[i].move(i + 10, i + 20); cout << "Exiting main..." << endl; return 0; }
a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23
8.1 数组
9
8.1.2 数组的存储与初始化(续)
• 二维数组的初始化
▫ 将所有数据写在一个{}内,按顺序赋值
例如:static nt a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
8.1 数组 —— 8.1.4 以数组作为函数参数
18
例8-4 (续)

字符字符串字符数组字符串指针指针数组(C语言)

字符字符串字符数组字符串指针指针数组(C语言)

字符字符串字符数组字符串指针指针数组(C语⾔)⼀、字符指针、字符数组1. 字符指针:字符串指针变量本⾝是⼀个变量,⽤于存放字符串的⾸地址。

⽽字符串本⾝是存放在以该⾸地址为⾸的⼀块连续的内存空间中并以‘\0’作为串的结束。

char *ps="C Language"; 顺序是:1.分配内存给字符指针;2.分配内存给字符串;3.将字符串⾸地址赋值给字符指针;可以写为:char *ps; #ps字符串指针,是指针,是⼀个变量,ps="C Language"; #ps为字符串的⾸地址,利⽤ps++可遍历字符串,字符串存储在以ps为开始地址的地段连续的内存空间中,并以'\0'作为字符串的结束。

这⾥有两点需要注意:①定义字符指针char *a中,*a只是指向⼀个字符。

举例如下:#include<stdio.h>int main(){char *a= "bcd" ;printf("输出字符:%c\n",*a); //输出字符printf("输出字符:%c\n",*(a+1)); //输出字符/printf("输出字符串:%s\n",a); //输出字符串}运⾏结果如下:②若字符串常量出现在在表达式中,代表的值为该字符串常量的第⼀个字符的地址。

char *a; a="hello";这⾥字符串"hello"仅仅代表其第⼀个字符的地址。

2. 字符数组:字符数组是由于若⼲个数组元素(⼀个个字符)组成的,它可⽤来存放整个字符串。

(即⽤字符数组来存放字符串)。

在c语⾔中,将字符串作为字符数组来处理。

(c++中不是)字符数组初始化的⽅法:1). 可以⽤字符串常量来初始化字符数组:char str[]={"Iamhappy"}; //可以省略花括号char str[]="Iamhappy"; //系统⾃动加⼊‘\0’注意:上述这种字符数组的整体赋值只能在字符数组初始化时使⽤,不能⽤于字符数组的赋值,字符数组的赋值只能对其元素⼀⼀赋值。

c语言字符串指针数组用法

c语言字符串指针数组用法

c语言字符串指针数组用法
C语言中的字符串指针数组是由多个指向字符串的指针组成的数组。

每个指针指向一个字符串,通过数组的下标可以访问不同的字符串。

下面是一个简单的示例代码,演示了字符串指针数组的用法:
```c
#include <stdio.h>
int main() {
// 声明字符串指针数组
char *names[3] = {
"Alice",
"Bob",
"Charlie"
};
// 遍历字符串指针数组
for (int i = 0; i < 3; i++) {
printf("Name %d: %s\n", i, names[i]);
}
return 0;
}
```
输出结果为:
```
Name 0: Alice
Name 1: Bob
Name 2: Charlie
```
在上面的示例中,`names`是一个包含3个指向字符串的指针
的数组。

每个指针指向一个字符串常量。

通过使用数组的下标,可以访问对应的字符串,并将其打印出来。

需要注意的是,字符串指针数组中的每个指针可以指向不同长度的字符串,甚至可以指向空字符串。

因此,在使用字符串指针数组时要谨慎处理每个指针所指向的字符串长度和内存管理。

例如,如果需要修改字符串指针数组中的字符串内容,可能需要分配额外的内存空间,并使用`strcpy`等函数将字符串内容
复制到新的内存空间中。

字符串的指针和指向字符串的指针变量

字符串的指针和指向字符串的指针变量

10.4字符串的指针和指向字符串的指针在C语言中,既可以用字符数组表示字符串,也可用字符指针变量来表示;引用时,既可以逐个字符引用,也可以整体引用。

字符串在内存中的起始地址称为字符串的指针,可以定义一个字符指针变量指向一个字符串。

1.定义字符指针变量★char *ps1;ps1="form one";char *ps1="form one";★char str[ ]= "form one", *ps1;★ps1=str;注意:字符指针变量ps1中,仅存储串常量的地址,而串常量的内容(即字符串本身),是存储在由系统自动开辟的内存块中,并在串尾添加一个结束标志’\0’。

2. 引用1)逐个引用main(){ char *string="I am fine.";for(; *string!=’\0’; string++)printf("%c", *string);printf("\n");}2) 整体引用main(){ char *string="I am fine.";printf("%s\n",string);}程序说明:printf("%s\n",string);语句通过指向字符串的指针变量string,整体引用它所指向的字符串的原理:系统首先输出string指向的第一个字符,然后使string自动加1,使之指向下一个字符;重复上述过程,直至遇到字符串结束标志。

注意:其它类型的数组,是不能用数组名来一次性输出它的全部元素的,只能逐个元素输出。

3.字符指针变量与字符数组之比较虽然用字符指针变量和字符数组都能实现字符串的存储和处理,但二者有区别.(1)存储内容不同。

字符指针变量中存储的是字符串的首地址,而字符数组中存储的是字符串本身(数组的每个元素存放一个字符)。

C++中字符串以及数组和指针的互相使用讲解

C++中字符串以及数组和指针的互相使用讲解

C++中字符串以及数组和指针的互相使⽤讲解C++字符串与指针在C++中可以⽤3种⽅法访问⼀个字符串(在第5章介绍了前两种⽅法)。

⽤字符数组存放⼀个字符串【例】定义⼀个字符数组并初始化,然后输出其中的字符串。

#include <iostream>using namespace std;int main( ){char str[]="I love CHINA!";cout<<str<<endl;return 0;}运⾏时输出:I love CHINA!⽤字符串变量存放字符串【例】定义⼀个字符串变量并初始化,然后输出其中的字符串。

#include <string>#include <iostream>using namespace std;int main( ){string str="I love CHINA!";cout<<str<<endl;return 0;}⽤字符指针指向⼀个字符串【例】定义⼀个字符指针变量并初始化,然后输出它指向的字符串。

#include <iostream>using namespace std;int main( ){char *str="I love CHINA!";cout<<str<<endl;return 0;}对字符串中字符的存取,可以⽤下标⽅法,也可以⽤指针⽅法。

【例】将字符串str1复制为字符串str2。

定义两个字符数组str1和str2,再设两个指针变量p1和p2,分别指向两个字符数组中的有关字符,通过改变指针变量的值使它们指向字符串中的不同的字符,以实现字符的复制。

#include <iostream>using namespace std;int main( ){char str1[]="I love CHINA!",str2[20],*p1,*p2;p1=str1;p2=str2;for(;*p1!='\\0';p1++,p2++)*p2=*p1;*p2='\\0';p1=str1;p2=str2;cout<<"str1 is: "<<p1<<endl;cout<<"str2 is: "<<p2<<endl;return 0;}运⾏结果为:str1 is: I love CHINA!str2 is: I love CHINA!这个例⼦⽤来说明怎样使⽤字符指针。

第8章 指针-3字符数组和字符指针 - 字符串的表示与存储

第8章 指针-3字符数组和字符指针 - 字符串的表示与存储

第8章指针——字符数组与字符指针:字符串的表示与存储printf("How are you");H o w a r e y o u \0printf("How are you.\n "); printf("\"How are you.\"\n"); How are you._printf("How are you. Press \a key and then press Enter:\n");How are you. Press a key and then press Enter:_"How are you."_ printf("How are you. Press ""a key and then press Enter:\n"); 问题:如果字符串太长,怎么表示?⏹C语言没有提供专门的字符串数据类型⏹字符数组——每个元素都是字符类型的数组H o w a r e y o u 0H o w a r e y o u \0⏹字符数组的定义#define STR_LEN 80char str[STR_LEN+1];⏹字符数组的初始化用字符常量的初始化列表对数组初始化char str[6] = {'C','h','i','n','a','\0'};用字符串常量直接对数组初始化char str[6] = {"China"};char str[6] = "China";char str[ ] = "China";charchar str[10] = "China";⏹字符指针就是指向字符串首地址的指针⏹定义一个字符指针,使其指向一个字符串常量H e l l o C h i n a \0将字符指针指向一个字符串H e l l o C h i n a \0"Hello China";char *pStr =*pStr 'W';用字符数组保存一个字符串H e l l o C h i n a \0 "Hello China"; char str[] =str str[0] = 'W';将字符指针指向一个字符数组H e l l o C h i n a \0"Hello China" char str[] = strchar *pStr;pStr = str;p = 'W'; = 'W';使用字符指针的基本原则正确使用字符指针须牢记以下基本原则: 明确字符串被保存到了哪里明确字符指针指向了哪里char *pStr;使用指针的基本原则⏹指针使用原则永远清楚指针指向了哪块内存永远清楚指针指向的内存中的内容是什么一个x型的指针指向x型变量的地址⏹总纲永远清楚你正在操作哪块内存永远清楚这种操作是否合理、合法。

关于指针与数组定义的字符串

关于指针与数组定义的字符串

关于指针与数组定义的字符串1. 将指针指向⼀串字符串(char *a = "abcdef";),可以以 “printf("a[2] = %c\n", a[2])“ 这种⽅式输出字符串中第三个字符。

但不能这样“a[2] = 'G' “ 妄图将字符串中的第三个字符‘c'改为‘G‘。

⾄于为什么,我现在是不知道了。

先看代码。

1 #include <stdio.h>23int main(void)4 {5char *a = "abcdef";6 printf("a[2] = %c\n", a[2]);//可以正确输出a[2] = c7 a[2] = 'G';//到了这⾥程序不正常结束。

89 printf("In main = %s\n",a);10return0;11 }做⼀点⼩⼩的改动,就可以在做到更改字符串中的某个位置的字符了。

看代码:#include <stdio.h>int main(void){char a[10] = "abcdef"; ------> 修改这⼉.printf("a[2] = %c\n", a[2]);//正确输出a[2] = ca[2] = 'G';printf("In main = %s\n",a);//正确输出In main = abGdefreturn0;}这两个代码的⼩⼩差距映射出的东西很有趣。

给他们加点东西继续看看。

2. 这⾥看看在函数调⽤。

1 #include <stdio.h>23void change_piont(char*);45int main(void)6 {7char *a = "abcdef";8 printf("a[2] = %c\n", a[2]);910 change_piont(a);11 printf("In main = %s\n",a);12return0;13 }1415void change_piont(char *a)16 {17 printf("a[2] = %c\n",a[2]);//这⾥可以输出a[2] = c,说明这个函数⾥可以访问指针a。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在初学习C语言时,对于指针是最容易让人迷糊的,尤其对于指针数组,而且是指向字符串的指针数组,恐怕就更难理解了。

下面本人给出一个例子,详细讲解指向字符串的指针数组的使用情况。

希望给予学习C的朋友一点帮助。

下述程序执行后,输出结果是什么?
#include <stdio.h>
char *p[2][3]={ "abc","defgh","ijkl","mnopqr","stuvw","xyz"};
main(){
printf("%c\n",***(p+1));
printf("%c\n",**p[0]);
printf("%c\n",(*(*(p+1)+1))[4]);
printf("%c\n",*(p[1][2]+2));
printf("%s\n",**(p+1));
}
答案是:
m
a
w
z
mnopqr
答案解析:
这里相当于定义了2行3列共6个元素的数组,数组的每一个元素都是指向字符的指针变量。

其中p[0][0]指向串"abc",p[0][1]指向串"defgh",p[0][2] 指向串"ijkl",p[1][0]指向串"mnopqr",p[1][1]指向串"stuvw",p[1][2] 指向串"xyz"。

1、printf("%c\n",***(p+1));
这里的***(p+1)相当于*(*(*(p+1)+0)+0),而*(*(p+1)+0)+0)的另一种容易懂的形式是p[1][0],在多维数组中这两种写法等价。

如上面所写的p[1][0]是指向串"mnopqr",即保存的是串"mnopqr"的首地址,也即字母m的地址。

因此***(p+1)是字母m
2、printf("%c\n",**p[0]);
这里的**p[0]等价于*(*(*(p+0)+0)+0),也即*(p[0][0]),而p[0][0])指向串"abc",所以*(p[0][0])是字符a
3、printf("%c\n",(*(*(p+1)+1))[4]);
(*(*(p+1)+1))[4]等价于*((p[1][1])+4),而(p[1][1])指向串"stuvw",所以*((p[1][1])+4)是在串首向后移动4个单位的字符,也即w
4、printf("%c\n",*(p[1][2]+2));
因为p[1][2]指向串"xyz",而p[1][2]+2 就是串首向后移动2个字节(一个字节保存一个字符),也就是指向字符z,所以*(p[1][2]+2)是字符z
5、printf("%s\n",**(p+1));
**(p+1) 等价于*(*(p+1)+0),也即p[1][0],指向串"mnopqr"首,就是串"mnopqr"的首地址。

所以输出是串mnopqr。

相关文档
最新文档