指针典型例题分析与解答
指针经典练习题及答案
二、程序题1、计算字符串中子串出现的次数。
要求:用一个子函数subString()实现,参数为指向字符串和要查找的子串的指针,返回次数。
2、加密程序:由键盘输入明文,通过加密程序转换成密文并输出到屏幕上。
算法:明文中的字母转换成其后的第4个字母,例如,A变成E(a变成e),Z变成D,非字母字符不变;同时将密文每两个字符之间插入一个空格。
例如,China转换成密文为G l m r e。
要求:在函数change中完成字母转换,在函数insert中完成增加空格,用指针传递参数。
3、字符替换。
要求用函数replace将用户输入的字符串中的字符t(T)都替换为e(E),并返回替换字符的个数。
4、编写一个程序,输入星期,输出该星期的英文名。
用指针数组处理。
5、有5个字符串,首先将它们按照字符串中的字符个数由小到大排列,再分别取出每个字符串的第三个字母合并成一个新的字符串输出(若少于三个字符的输出空格)。
要求:利用字符串指针和指针数组实现。
6、定义一个动态数组,长度为变量n,用随机数给数组各元素赋值,然后对数组各单元排序,定义swap函数交换数据单元,要求参数使用指针传递。
7、实现模拟彩票的程序设计:随机产生6个数字,与用户输入的数字进行比较,输它们相同的数字个数(使用动态内存分配)。
/*1、计算字符串中子串出现的次数。
要求:用一个子函数subString()实现,参数为指向字符串和要查找的子串的指针,返回次数。
*/#include<stdio.h>int subString(char *a, char *b){int i = 0;int j = 0;int m = 0;char *p = b;while(*a){while(*a){if(*a == *b){break;}a++;}while(*b){if(*a != *b){return m;}else{m = m;}b++;a++;}// a++;b = p;++m;}return m;}int main(){char a[100];char b[100];printf("请输入字符串a:");gets(a);printf("请输入字符串b:");gets(b);printf("%d", subString(a, b));return 0;}/*2、加密程序:由键盘输入明文,通过加密程序转换成密文并输出到屏幕上。
c语言指针例题
以下是一个简单的 C 语言指针例题:
c复制代码
#include<stdio.h>
int main() {
int a = 10;
int *p = &a; // 定义一个指向整型变量 a 的指针 p
printf("a 的值为:%d\n", a);
printf("p 所指向的值为:%d\n", *p); // 通过指针访问变量的值
*p = 20; // 通过指针修改变量的值
printf("a 的新值为:%d\n", a);
return0;
}
在这个例子中,我们定义了一个整型变量 a,然后定义了一个指向整型变量 a 的指针 p,并将指
针 p 的初始值设置为变量 a 的地址。
接着,我们通过指针访问变量的值,并修改了变量的值。
最后,我们输出了变量 a的新值。
需要注意的是,在使用指针时需要特别小心,因为指针操作涉及到内存地址的操作,如果操作不当可能会导致程序崩溃或者出现其他不可预期的错误。
C语言指针练习题解析
一、知识点1.掌握指针、地址、指针类型、空指针(NULL)等概念;2.掌握指针变量的定义和初始化、指针的间接访问、指针的加减运算、指针变量比较运算和指针表达式;3.掌握指针与数组、函数、字符串等的联系;4.掌握动态空间操作(new,delete);5.掌握引用参数的使用。
二、例题分析与解答例题1:若有以下定义,则说法错误的是( )。
int a=100,*p=&a ;A.声明变量p,其中*表示p是一个指针变量B.变量p经初始化,获得变量a的地址C.变量p只可以指向一个整形变量D.变量p的值为100答案:D分析:有指针变量定义可知A、C说法是正确的,故不能选。
在语句中&p=a,表示指针变量取得变量a地址,B说法也正确,也不能选择。
D中不能说变量p的值为100,应该*p的值为100,所以选择D。
例题2:若有以下定义,则赋值正确的是( )。
int a ,b , *p;float c, *q;A.p=&c B.q=p C.p=NULL D.q=new int答案:C分析:指针变量使用规定,不同类型的指针变量不能赋值,也不能取得普通变量地址,故A、B不正确,不能选择。
因为q是float类型指针变量,不能申请int 类型地址,D不正确,也不能选择。
因为任何类型的指针变量都能取得NULL指针,所以C正确。
例题3:如果x是整型变量,则合法的形式是( )。
A.&(x+5) B.*x C.&*x D.*&x答案:D分析:因为C++语言表达式没有地址,A不正确。
C++语言普通变量不能用*运算,因此B和C也不正确。
&x 表示变量x的地址,*&x是x 地址的值,所以D正确。
例题4:若要建立如下关系,错误的语句组是( )。
span style='mso-ignore:vglayout; ;z-index:1;left:0px;margin-left:144px;margin-top:1px;width:256px;height:38px'A. B. C. D.int *p=&x, x; int x, p=&x; int *p, x=10; int *p, x;*p=10; *p=10; *p=&x; p=&x ; x=10;答案:A分析:在变量类型说明语句中 *表示变量是指针变量,在其他语句中,*称为指针运算,用于访问指针所指向的对象的值,&称为取地址运算,用来得到一个对象的地址。
第五章指针习题解答
习题解答第五章指针1、指针的基类型定义了该指针所指向变量的类型。
从技术上讲,任何类型的指针均可指向内存中的任何位置,但因所有的指针运算都是与它的基类型相关联的,所以正确说明指针非常重要。
(1)基类型使指针只能指向基类型定义的一类变量。
(2)限制引用操作满足基类型的约束(范围、运算、内存表示)。
(3)限制指针移动操作的跨度。
2、(1)通过指针引用数组元素是C语言提供的一种高效数组访问机制,通过带下标的指针变量引用一维数组元素。
(2)通过指针指向数组或数组元素的地址完成各种赋值、引用、移动、比较等操作。
数组名在C语言中被处理成一个地址常量,也就是数组所占连续存储单元的起始地址,一旦定义,数组名永远是数组的首地址,在其生存期不会改变。
可以通过数组首地址引用数组元素,输出数组中全部元素。
也可以将数组名与数组指针赋值完成各种操作。
3、(1)指针数组定义形式为int * a[size];实质是一个数组,共有size个元素,其中每个元素都是指针类型的,并且每个元素的基类型是整型。
(2)数组指针定义形式为int (*p)[size];实质是一个变量,是一个指针变量,这个指针变量的基类型是size 个int类型元素的数组。
简单的说数组指针是一个指针,它指向一个数组,通过这个指针可以对数组进行多种操作,和使用数组下标起到相同的作用,这个指针最初指向数组第一个元素;指针数组就是一个数组,它里边的元素都是指针。
举例如下:int *p[5]; // 指针数组,p是数组名,数组里放5个int指针。
int (*p)[5]; // 数组指针,p是指针名,指向一个有5个int元素的数组。
4、(1)int *p;//定义了一个基类型为整型的指针变量p即p是整型指针。
(2)int *p[5];//定义了一个指针数组p,数组中含有5个基类型为整型的指针,即p 是5个元素的数组,数组元素是整型指针。
(3)int (*p)[5]; 定义了一个数组指针p,p指向一个含有5个整型元素的数组,即p 是指针,指向数组,数组有5个整型元素。
指针例题
指针变量的引用1.输入a和b两个整数,按先大后小的顺序输出a和b。
⏹解题思路:用指针方法来处理这个问题。
不交换整型变量的值,而是交换两个指针变量的值。
#include <stdio.h>int main(){ int *p1,*p2,*p,a,b;printf(“integer numbers:");scanf(“%d,%d”,&a,&b);p1=&a; p2=&b; //对指针变量赋初值if(a<b){ p=p1; p1=p2; p2=p; } //当a<b时,交换指针变量p1 ,p2指向的地址值printf(“a=%d,b=%d\n”,a,b);printf(“%d,%d\n”,*p1,*p2);return 0;}输入:5,9输出结果:a=5,b=99,5指针引用数组元素1. 有一个整型数组a,有10个元素,要求输出数组中的全部元素。
解题思路:引用数组中各元素的值有3种方法:(1)下标法;(2)通过数组名计算数组元素地址,找出元素的值;(3) 用指针变量指向数组元素(1) 下标法#include <stdio.h>int main(){ int a[10]; int i;printf(“enter 10 integer numbers:\n");for(i=0;i<10;i++) scanf("%d",&a[i]);for(i=0;i<10;i++) printf(“%d ”,a[i]);printf("%\n");return 0;}(2) 通过数组名计算数组元素地址,找出元素的值#include <stdio.h>int main(){ int a[10]; int i;printf(“enter 10 integer numbers:\n");for(i=0;i<10;i++) scanf("%d",&a[i]);for(i=0;i<10;i++)printf(“%d ”,*(a+i)); // *(a+i) 和a[i] 等价printf("\n");return 0;}(3) 用指针变量指向数组元素#include <stdio.h>int main(){ int i,*p,a[10],;printf(“enter 10 integer numbers:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);for(p=a;p<=(a+9);p++) // 数组名a赋值给p,a+9表示数组最后一个元素a[9]的起始地址printf(“%d ”,*p);printf("\n");return 0;}#include <stdio.h>int main(){ int i,*p,a[10];printf("please enter 10 integer numbers:");for(p=a,i=0;i<10;i++) // 用指针变量输入,要将数组起始地址赋值给pscanf("%d",p++);p=a;for(i=0;i<10;i++,p++)printf("%d ",*p);printf("\n");return 0;}3种方法的比较:①第(1)和第(2)种方法执行效率相同◆C编译系统是将a[i]转换为*(a+i)处理的,即先计算元素地址。
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:将一个整数数组按升序排序。
(完整word版)C语言指针练习+答案+讲解
第七章指针7.1 选择题1.若有说明:int a=2, *p=&a, *q=p;,则以下非法的赋值语句是(D)。
A. p=q; B. *p=*q; C. a=*q; D. q=a;a是整型数,int *p,*q定义了指针,p,q是指向整型的指针.p取得a的地址,而q取得p的地址p,q是指针(也就是一个地址),而*p和*q是这个指针指向的整型数值(存放在这个地址的值).A)把q的地址赋给p,则p和q完全一样了,都指向一个数2B)把q中数据个pC)把q中数据给aD)a中数据是2,不能够给一个地址。
除非*q=a2.若定义:int a=511, *b=&a;,则printf("%d\n”, *b);的输出结果为:D A.无确定值 B. a的地址 C. 512 D. 511int a=511,*b=&a;a 是整形变量b 是整形指针变量,指向 aprintf("%d\n",*b);就是输出指针变量 b,所指变量的值输出结果5113.已有定义int a=2, *p1=&a, *p2=&a; 下面不能正确执行的赋值语句是(B)。
A. a=*p1+*p2; B. p1=a; C. p1=p2; D. a=*p1*(*p2);47、已知在程序中定义了如下的语句:int *P1,*P2;int k;p1=&k;p2=&k;则下列语句中不能正确执行是( B )A、k=*P1+*P2;B、p2=k;C、P1=P2;D、K=*P1 * (*P2);P1 P2是指针,K是整型变量,变量怎么可以赋值给指针呢?A其实是执行了K=K+K(P1和P2都指向K,所以*P1 *P2其实都是指K)C是赋值语句D其实执行了K=K*K4.变量的指针,其含义是指该变量的(B)。
A.值 B.地址 C.名 D.一个标志5.若有说明语句:int a, b, c, *d=&c;,则能正确从键盘读入三个整数分别赋给变量a、b、c的语句是(A)。
C语言指针精选习题和答案
一、用指针方法编写一个程序,输入3个整数,将它们按由小到大的顺序输出#include <stdio.h>void swap(int *pa,int *pb){int temp;temp = *pa;*pa = *pb;*pb = temp;}void main(){int a,b,c,temp;scanf("%d%d%d",&a,&b,&c);if(a>b)swap(&a,&b);if(b>c)swap(&b,&c);if(a>c)swap(&a,&c);printf("%d,%d,%d",a,b,c);}二、C语言用指针方法输入3个字符串按由小到大顺序输出#include "stdio.h"#include "string.h"int main(int argc, char* argv[]){char *t;char *p1=NULL,*p2=NULL,*p3=NULL;char ch1[20]={0},ch2[20]={0},ch3[20]={0};p1=ch1;p2=ch2;p3=ch3;printf("No1:");scanf("%s",p1);fflush(stdin);printf("No2:");scanf("%s",p2);fflush(stdin);printf("No3:");scanf("%s",p3);fflush(stdin);if(strcmp(p1,p2)>0){t=p1;p1=p2;p2=t;}if(strcmp(p1,p3)>0){t=p1;p1=p3;p3=t;}if(strcmp(p2,p3)>0){t=p2;p2=p3;p3=t;}printf("%s\n%s\n%s\n",p1,p2,p3);return 0;}9.4编程输入一行文字,找出其中的大写字母,小写字母,空格,数字,及其他字符的个数#include<stdio.h>void main(){int a=0,b=0,c=0,d=0,e=0,i=0;char *p,s[20];while((s[i]=getchar())!='\n')i++;p=s;while(*p!=10){if(*p>='A'&&*p<='Z')a++;else if(*p>='a'&&*p<='z')b++;else if(*p==' ')c++;else if(*p>='0'&&*p<='9')d++;else e++;p++;}printf("大写字母%d 小写字母%d\n",a,b);printf("空格 %d 数字 %d 非字符 %d\n",c,d,e);}9.5写一个函数,将3 3矩阵转置#include "stdio.h"void Transpose(int (*matrix)[3]){int temp;int i, j;for(i=1;i<3;i++)/*转置*/{for(j=0;j<i;j++){temp = *(*(matrix+j)+i);*(*(matrix+j)+i) = *(*(matrix+i)+j);*(*(matrix+i)+j) = temp;}}}void main(){int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};Transpose(a);for(int i = 0;i<3;i++){for(int j=0;j<3;j++){printf("%d ",a[i][j]);}printf("\n");}}}9.6用指向一维数组的指针做函数参数#include<stdio.h>#include<string.h>int main(){void sort(char (*s)[6]);//一维数组的指针做函数参数int i;char str[10][6];char (*p)[6];//定义一维数组的指针做函数参数printf("please input string:/n");for(i=0;i<10;i++)scanf("%s",&str[i]);p=str;//将str一维数组指针,赋值给p;sort(p);printf("the output sequence :/n");for(i=0;i<10;i++)printf("%s/n",str[i]);return 0;}void sort(char (*s)[6])//s指向一维数组的指针做函数参数;{int i,j;char temp[6], *t;t=temp;for(i=0;i<9;i++)//i应该小于9;如果小于10,那么就比较了9+1次;按照冒泡法则,for(j=0;j<9-i;j++)//第一次比较需要9次就是i=0到i=8共九次;第二次需要比较8次;依次类推;if(strcmp(s[j],s[j+1])>0){strcpy(t,s[j]);strcpy(s[j],s[j+1]);strcpy(s[j+1],t);}}9.7编一程序,用指针数组在主函数中输入十个等长的字符串。
第3章 数据类型——指针习题(有答案)
23.char *(*pfb)(const char *)=fb;
24.B
25.B
int(*pf1)(int);
pf1=f1;//或合并为:int(*pf1)(int)=f1;
char *(*pf2)(int,char *);
pf2=f2;//或合并为:char *(*pf2)(int,char*)=f2;
(2)函数指针的应用:
#include<iostream.h>
intadd(inta,intb){returna+b;}
20.已知变量a,b定义为:inta=99,&b=a;则cout<<a-1<<’,’<<b+1;的输出是()。
21.已知变量x,y定义为:intx[]={99,98,97},&y=x[1];则cout<<y-1<<’,’<<y*2;的输出是()。
22.已知函数fa的原形是:intfa(int,char*);,pfa是指向fa的指针,则pfa的定义是()
D.*(*(X+I)+j)
16.(单选)要使指针变量p指向2维数组A的第一个元素(0行0列元素),正确的赋值表达式是()。
A.p=A或p=A[0][0]
B.p=A[0]或p=A[0][0]
C.p=A[0]或p=&A[0][0]
D.p=A或p=&A[0][0]
17.下列程序功能是:将字符串中的小写字母都改成对应的大写字母,其他字母不变。请更改程序中的错误。
23.已知函数fb的原形是:char *fb(const char *);,pfb是指向fb的指针,则pfb的定义是()。
c++指针例题及解析
c++指针例题及解析下面是一个简单的 C++ 指针例题及解析:题目:#include <iostream>int main() {int x = 5;int y = 10;int* ptrX = &x;int* ptrY = &y;std::cout << "Value of x: " << x << std::endl;std::cout << "Address of x: " << &x << std::endl;std::cout << "Value pointed by ptrX: " << *ptrX << std::endl;std::cout << "\nValue of y: " << y << std::endl;std::cout << "Address of y: " << &y << std::endl;std::cout << "Value pointed by ptrY: " << *ptrY << std::endl;return 0;}解析:这个例子演示了基本的指针概念。
让我们逐步解析:int x = 5;:声明一个整数变量 x 并初始化为 5。
int y = 10;:声明另一个整数变量 y 并初始化为 10。
int* ptrX = &x;:声明一个整型指针 ptrX,指向 x 的地址。
int* ptrY = &y;:声明另一个整型指针 ptrY,指向 y 的地址。
std::cout << "Value of x: " << x << std::endl;:输出 x 的值。
c语言指针习题及答案
c语言指针习题及答案C语言指针习题及答案C语言作为一门广泛应用于软件开发和系统编程的编程语言,指针是其重要的特性之一。
掌握指针的使用对于理解和编写高效的C程序至关重要。
本文将介绍一些常见的C语言指针习题,并提供相应的答案,帮助读者更好地理解和掌握指针的概念和用法。
1. 习题一:交换两个变量的值请编写一个函数,接受两个整型指针作为参数,实现交换两个变量的值。
例如,如果输入a=10,b=20,函数执行后,a=20,b=10。
答案:```cvoid swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;}```2. 习题二:查找数组中的最大值和最小值请编写一个函数,接受一个整型数组和数组长度作为参数,返回数组中的最大值和最小值。
例如,对于数组[5, 2, 9, 1, 7],函数应该返回最大值9和最小值1。
答案:```cvoid findMinMax(int *arr, int length, int *max, int *min) {*max = *min = arr[0];for (int i = 1; i < length; i++) {if (arr[i] > *max) {*max = arr[i];}if (arr[i] < *min) {*min = arr[i];}}}```3. 习题三:计算字符串长度请编写一个函数,接受一个字符串作为参数,返回字符串的长度。
例如,对于字符串"Hello, World!",函数应该返回12。
答案:```cint stringLength(char *str) {int length = 0;while (*str != '\0') {length++;str++;}return length;}```4. 习题四:复制字符串请编写一个函数,接受两个字符串指针作为参数,将第一个字符串复制到第二个字符串中。
指针经典练习题(含答案版)一
指针一.填空题(20分)1. 指针变量是把内存中另一个数据的地址作为其值的变量。
2. 能够直接赋值给指针变量的整数是 0。
3. 如果程序中已有定义:int k;1)定义一个指向变量k的指针变量p的语句是 int* p = &k; 。
2)通过指针变量,将数值6赋值给k的语句是 *p = 6; 。
3)定义一个可以指向指针变量p的变量pp的语句是 int ** pp; 。
4)通过赋值语句将pp指向指针变量p的语句是 pp = &p; 。
5)通过指向指针的变量pp,将k的值增加一倍的语句是 *(*pp)*= 2; 。
4. 当定义某函数时,有一个形参被说明成int *类型,那么可以与之结合的实参类型可以是int型指针、 int型数组等。
4. 以下程序的功能是:将无符号八进制数字构成的字符串转换为十进制整数。
例如,输入的字符串为:556,则输出十进制整数366。
请填空。
45*8#include <stdio.h>main( ){ char *p,s[6]; int n; p=s; gets(p); n=*p-'0';while( *++p != '\0') //先++ ,后*n=n*8+*p-'0';printf("%d \n",n);}二.选择题(22分)1. 以下count函数的功能是统计substr在母串str中出现的次数。
int count(char *str,char *substr){ int i,j,k,num=0;for(i=0; ①B ;i++){for( ②B ,k=0;substr[k]==str[j];k++,j++)if(substr[ ③C ]==’\0’){num++;break;}}return num;}①A) str[i]==substr[i] B) str[i]!=‘\0’C) str[i]==‘\0’ D) str[i]>substr[i]②A) j=i+1 B) j=i C) j=i+10 D) j=1③A) k B) k++ C) k+1 D) ++k2. 以下Delblank函数的功能是删除字符串s中的所有空格(包括Tab、回车符和换行符)。
c语言指针编程题及详解
c语言指针编程题及详解c语言指针编程是一门用于编程的常见开发技术,通过指针的操作,可以让程序具备更强的表达能力,并且可以极大的减少代码的重复性。
根据其特性,以下列出了c语言指针编程的常见题目及详细解答:一、给定一个整型数组,使用指针把数组中的数字复制到另一个数组中相同的位置:解:#include<stdio.h>int main(){int *ptr1, *ptr2;int array1[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int array2[10];ptr1 = array1; //设置指针1指向数组1的第一个元素ptr2 = array2; //设置指针2指向数组2的第一个元素while (ptr1<array1+10){ //当指针1指向的位置小于数组1的最后一个元素时,循环执行以下步骤*ptr2 = *ptr1; //将指针1指向的值赋值给指针2指向的位置ptr1++; //指针1指向下一个数组1中的元素ptr2++; //指针2指向下一个数组2中的元素}return 0;}二、给定两个整型数组,使用指针比较数组元素的大小:解:#include<stdio.h>int main(){int *ptr1, *ptr2;int array1[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int array2[10] = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};ptr1 = array1; //设置指针1指向数组1的第一个元素ptr2 = array2; //设置指针2指向数组2的第一个元素while (ptr1<array1+10) { //当指针1指向的位置小于数组1的最后一个元素时,循环执行以下步骤if (*ptr1 > *ptr2) {printf("数组1元素大于数组2元素\n");} else if (*ptr1 < *ptr2) {printf("数组1元素小于数组2元素\n");} else {printf("数组1元素等于数组2元素\n");}ptr1++; //指针1指向下一个数组1中的元素ptr2++; //指针2指向下一个数组2中的元素}return 0;}三、用指针计算数组的最大值及最小值:解:#include<stdio.h>int main(){int *ptr, max, min;int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//定义指针及最大最小值变量ptr = array;max = *ptr;min = *ptr;//开始循环比较for (ptr=array; ptr<array+10; ptr++){if (*ptr > max) {max = *ptr; //将指针指向元素的值与最大值进行比较,如果指向元素的值大,在赋值给最大值}if(*ptr < min){min = *ptr; //将指针指向元素的值与最小值进行比较,如果指向元素的值小,在赋值给最小值}}printf("max is %d , min is %d\n", max, min); return 0;}四、从指定的字符组件中取得字符串:解:#include <stdio.h>int main(){char arr[12] = "Hello World!", *str;str = &arr[6];printf("String is : %s\n", str);return 0;}。
c语言指针例题及解析
c语言指针例题及解析题目:已知 char **p 指向一个字符指针数组的首地址,其中数组的每个元素指向一个字符串,要求将数组中的字符串按顺序输出。
解析:首先,需要理解指针的指针的含义。
在 C 语言中,指针的指针是指向指针的指针,即一个指针变量中存储的是另一个指针变量的地址。
在本题中,char **p 指向一个字符指针数组的首地址,即 p 是一个指向指针的指针变量。
接下来,需要了解如何通过指针访问数组元素。
在 C 语言中,可以通过解引用运算符 * 来访问指针所指向的内容。
在本题中,数组的每个元素指向一个字符串,因此可以通过*p[i] 来访问第 i 个字符串。
最后,需要使用 printf 函数输出字符串。
在 C 语言中,printf 函数用于格式化输出,可以通过 %s 格式化符来输出字符串。
根据以上解析,可以使用以下代码实现题目要求的功能:c#include <stdio.h>int main() {char *strs[] = {"hello", "world", "C","language"};char **p = strs; // p 指向 strs 的首地址// 输出每个字符串for (int i = 0; i < 4; i++) {printf("%s\n", *p[i]); // 通过解引用运算符 * 来访问第 i 个字符串}return 0;}在上面的代码中,首先定义了一个字符指针数组 strs,其中包含了四个字符串。
然后定义了一个指向指针的指针变量 p,并将其初始化为 strs 的首地址。
接下来使用 for 循环遍历数组中的每个字符串,并使用 printf 函数输出每个字符串。
在输出时,通过解引用运算符 * 来访问第 i 个字符串。
最后返回 0 表示程序正常退出。
c语言指针运用的基本问题及其典型例题分析
应改成:
作者简介:李菁(1979— ),女,湖南津市人,讲师,硕士;研究方向:数据应用,数据挖掘。
- 119 -
第24期 2019年12月
无 线 互 联 科 技·实 验研究
N o .2 4 D e c e m b e r,2 019
(3)字符串指针指向的是一个字符串,例如下面是错 误的:
int main( ) { char *string1="I love China!";
第24期 2019年12月
无线互联科技 Wireless Internet Technology
N o .2 4 D e c e mห้องสมุดไป่ตู้b e r,2 019
C语言指针运用的基本问题及其典型例题分析
李菁
(湖南电子科技职业学院,湖南 长沙 410000)
摘 要:文章分析了C语言指针的基本问题及其在使用中要注意事项并通过实例分析探讨了C语言指针的运用。最后,对C语 言指针中的典型例题进行了讲解,以便加深对C语言指针的认识和理解。 关键词:C语言;指针;典型例题
printf("%c\n",string1); //此处有错误 return 0; } 分析:st r i ng1是一个指针变量,指向字符串"I love China!",指针变量string1存放的是这个字符串的首地址。所 以输出的是一个字符串,应改写成printf(“%s\n”,string1); (4)函数指针变量的调用,以下是错误的:
指针例题经典c语言
指针例题经典c语言经典的 C 语言指针例题可以帮助你理解指针的基本概念和用法。
下面是一个简单的例题:#include <stdio.h>int main() {int num = 42;int *ptr;// 将指针指向变量 numptr = #// 输出变量 num 的值和地址printf("Value of num: %d\n", num);printf("Address of num: %p\n", &num);// 输出指针 ptr 的值(即 num 的地址)和内容printf("Value of ptr: %p\n", ptr);printf("Content of ptr: %d\n", *ptr);// 修改指针所指向的变量的值*ptr = 99;// 输出修改后的变量 num 的值printf("New value of num: %d\n", num);return 0;}这个例题演示了以下几个概念:声明指针:int *ptr; 表示声明了一个整型指针 ptr。
指针赋值:ptr = # 将指针指向变量 num。
输出变量地址:printf("Address of num: %p\n", &num); 输出变量 num 的地址。
输出指针内容:printf("Content of ptr: %d\n", *ptr); 输出指针 ptr 所指向的变量的值。
修改指针所指向的变量:*ptr = 99; 将指针所指向的变量的值修改为 99。
这个例题可以帮助你理解指针是如何存储变量地址、如何访问所指向变量的内容,以及通过指针如何修改变量的值。
你可以在实际编程中修改和扩展这个例题,以加深对指针的理解。
指针重要例题演示 (2)
数组的排序和查找
通过指针和比较函数,可 以实现快速排序和二分查 找等算法,提高数组操作 的速度。
使用指针实现动态内存分配
动态内存分配
使用指针可以方便地实现动态内存分配,根据需要申请不同大小 的内存空间。
内存释放
通过指针可以正确地释放已分配的内存,避免内存泄漏和野指针 问题。
使用指针实现二叉树操作
二叉树的创建
通过指针可以方便地创建二叉树节点,并建立父子节点之间的链 接关系。
二叉树的遍历
使用指针可以高效地遍历二叉树中的每个节点,实现前序、中序和 后序遍历。
二叉树的查找和删除
通过指针可以方便地查找和删除二叉树中的节点,实现二叉树的动 态管理。
THANKS
感谢观看
函数 来调用函数。通过函数指针可以传递 函数作为参数,实现回调函数等功能 。
指针与字符串的关系
字符串常量与字符
数组
在C语言中,字符串常量实际上是 一个字符数组,可以通过字符数 组的地址来访问字符串中的字符。
字符串处理函数
C语言标准库提供了许多字符串处 理函数,如`strcpy()`, `strcat()`, `strlen()`等,这些函数通过指针 来操作字符串。
指针的赋值与解引用
总结词
将内存地址赋值给指针并获取该地址处的值
详细描述
通过使用&运算符获取变量的内存地址,并将其赋值给指针变量。解引用指针 是指通过*运算符获取指针所指向的值。例如,int a = 10; int *p = &a; *p = 20; // a的值变为20。
指针的算术运算
总结词
对指针进行加、减、增量和减量等算术运算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
指针典型例题分析与解答1 对于变量x,其地址可以写成________;对于数组y[10],其首地址可以写成________或__________;对于数组元素y[3],其地址可以写成__________或_________。
【分析】变量的地址可以写成“&变量名”。
数组的首地址就是数组名,也可以写成第 1个元素的地址“&数组名[0]”。
数组元素的地址可以写成“&数组元素”,也可以写成“数组首地址十下标”。
【答案】&xy&y[0]&y[3]y+32 设有定义语句“int k,*p1=&k,*p2;”,能完成表达式“p2=&k”功能的表达式可以写成_______________。
【分析】注意原来表达式“p2=&k”的主要功能是将变量k的地址存放到指针变量p2中。
现在变量k的地址已经存放在指针变量pl中,所以完成“p2=&k”功能的表达式是:p2=p1.【答案】p2=p13 设有两条语句“int a,*p=&a;”和“*p= a;”,则下列说法中正确的是()①两条语句中的“*p”含义完全相同②两条语句中的“*p=&a”和“*p=a”功能完全相同③第 1条语句中的“*p=&a”是定义指针变量 p并对其初始化④第2条语句中的“*p=a”是将a的值赋予变量p【分析】分析备选答案①:第1条语句是数据定义语句,其中的“*p”表示定义的变量p是指针型变量;第2条语句是赋值语句,其中的“*p”代表它所指向的变量a,所以该备选答案是错误的,不符合题意。
分析备选答案②:第 1条语句中的“*p=&a”是将变量 a的地址以初值方式赋予指针变量 p;而第 2条语句中的“*p=a”是将变量 a中的值赋予指针变量 P指向的变量(注意也是 a,即该语句的作用和 a = a完全相同),显然该备选答案是错误的,不符合题意。
再分析备选答案③:显然该答案是正确的,符合题意。
至于备选答案④,显然是错误的“*p”是代表指针变量p指向的变量,不能代表指针变量p。
【答案】③4 设有定义语句“ int x,*p= &x;”,则下列表达式中错误的是()①*&x②&*x ③*&p④&*p【分析】注意“*”和“&”运算将是同一优先级别的,结合性是自有向左。
接着来分报备选答案①:&x 代表变量x的地址,*(&x)代表“&x”地址对应的变量,即变量X,一股说“*&变量”就是该变量,所以该答案是正确的,不符合题意。
备选答案②中的“*x”是错误的,因为x是普通变量,不是指针型变量,而运算符“*”的运算对象必须是地址,所以该答案符合题意。
显然备选答案③和④都是正确的。
我们来分析一下。
备选答案③的格式属于“*&变量”,所以其结果为指针型变量p,是正确的。
备选答案④中的“*P”代表指针变量P指向的变量x,(*p)代表变量X的地址,也是正确的。
一般说“&*指针变量”,则代表指针变量指向的变量的址。
【答案】②5 设有定义语句“float s[10],*p1=s,*p2=s+5;”,下列表达式中错误的是()① p1= 0xffff ② p2--③ p1-p2 ④ p1<=p2【分析】当两个指针变量指向同一个数组时,每个针变量都可以进行增 l、减 1运算,两个指针变量之间可以进行减法运算和关系运算。
显然备选答案②、③。
④是正确的,不符合题意,只有备选答案①才是错误的,符合题意。
对备选答案①的分析也很简单,因为C语言规定,所以的地址表达式中,不允许使用具体的整数来表示地址。
【答案】①6 有下列定义语句“char s[]={"12345"},*p=s;”,下列表达式中错误的是()①*(p+2)②*(s+2) ③ p="ABC" ④ s="ABC"【分析】分析备选答案①:指针变量p已经指向数组s首地址,则p+2代表数组元素s[2]的地址,*(p +2)就是代表数组元素s[2],所以是正确的,不符合题意。
分析备选答案②:s是数组名,代表数组首地址,s+ 2代表数组元素 a[2]的地址,*(S+ 2)代表数组元素s[2],和备选答案①一样,也不符合题意。
分析备选答案③:C语言规定,在程序中可以使用赋值运算符将字符串常量直接赋予字符型指针变量,所以该备选答案也是正确的,不符合题意。
只有备选答案④是错误的,符合题意。
原因是C语言规定,在程序中不允许将字符串常量以赋值语句方式直接赋予字符型数组。
【答案】④7 设有语句“float x[4][10],*p=x;”,则下列表达式中不属于合法地址的表达式是()①&x[1][2]②*(p+1* 10+2)③x[1]④ p+1* 10+2[分析]分析备选答案①:x[1][2]是合法的数组元素,所以“&x[1][2]”表示数组元素 x[l][2]的地址。
分析备选答案②:由于指针变量指向二维数组首地址,“*(指针变量十行下标*列长度十列下标)”是表示数组元素“数组名[行下标][列下标]”的,不表示地址,所以该答案符合题意。
至于备选答案③,x[l]代表数组 X中行下标为 1的所有元素组成的一维数组名,即该一维数组的首地址,所以是一个地址表达式。
备选答案④中的表达式是代表数组元素x[1][2]的地址的,具体分析可以参看上面备选答案②中的分析。
【答案】②8 设有定义语句“double d[3][5]= {{1},{2},{3}},(*p)[5]=d;”,则下列表达式中值不为0.0的表达式是()①*&d[1][2] ②p[1][2]③*(p+1*5+2)④*(*(p+l)+2)【分析】首先看看数组d中各元素的初值,显然d[0][0]的初值为1.0、d[l][0]的初值为2.0.d[2][0]的初值为3.0,其余元素的初值均为0.0。
接着分析备选答案①:*&d[1][2]就是d[l][2],所以其值为0.0,不符合题意。
分析备选答案②:p[1][2]就是d[1][2],显然其值为 0.0,不符合题意。
再分析备选答案③:该表达式运算后的结果相当于*(p+7),由于指针变量p是指向长度为5的一维数组的,所以,这个表达式代表地址,其值不是0.0,符合题意。
显然备选答案④中表达式的值为0.0 ;因为该表达式相当于数组元素d[1][2]。
【答案】③9 设有定义语句“char s[3][20],(*p)[20]=s;”,则下列语句中错误的是()① scanf("%s", s[2]);② gets(*(p+2));③ scanf("%s",(p+2)+0);④ gets(s[2][0]);【分析】分析备选答案①、③,都是通过scanf()函数输入一个字符串,该函数中的第2个参数要求是地址。
备选答案①中的S[2]是一个地址,表示输入的字符串存人字符数组s的第2行,所以是正确的。
由于指针变量p是指向长度为20的一维数组,所以备选答案③中的*(p+2)+0相当于s[2][0] 的地址,也是正确的。
备选答案②、④是通过gets()输入字符串的,该函数的参数也是地址。
分析备选答案②中的*(p+2)字符数组s的第2行组成的一维数组的首地址,所以是正确的。
备选答案④中的s[2][0]是数组元素,不是地址,所以是错误的。
【答案】④10 设有下列程序段,该程序段输出的结果是int k[2]={5,4},*P[2];p[o]=k,p[l]=k+l;prinif("%d",*p[1]);【分析】从定义语句中可以看出,p是一个指针型数组,共有两个数组元素:p[0]和p[1]。
两个赋值表达式组成的逗号表达式使得p[0]指向整型数组元素k[0],其值为5;p[1]指向整型元素 k[l],其值为4。
输出语句中的输出表达式“*P[1]”是代表指针数组元素p[l]指向的整型数组元素k[1]的,其值为4。
【答案】 411 设有下列定义语句,则表达式“**p2”的值是_______________,表达式“*(*p2+l)”的值是_________________。
int x[3]={1,2,3},*p1= x,**p2=&p1;【分析】从定义语句中可以看出,pl是指向整型数组 X首地址的一级指针变量,p2是指向一级指针变量pl的二级指针变量。
从运算符“*”的结合性是自右向左的来看,表达式**p2相当于肝*(*p2),*p2相当于p1,所以**p2相当于*pl,由于一级指针变量p1指向的是数组X的首地址,即x[0]的地址,所以其值为x[0]的值,等于1。
第2个表达式*(*p2+1)相当于*(p1+1),而pl+l相当于数组元素x[1]的地址,所以该表达式的值就是数组元素x[1]的值,等于2.【答案】 1212 设有下列程序,假定该程序运行后的输出是:234。
请填写程序中缺少的语句成份。
main(){ char *p="12345678";while(____________){ printf("%c",*p+1);p++;}}【分析】从数据定义语句中看出,字符型指针变量指向字符串"12345678",即指针变量p指向第1个字符'l'。
由于程序所缺少的是控制循环的条件,假定第1次执行循环体时条件成立,输出的结果是"*p+1",即是指向字符'l'的,'1'+1的结果是字符'2',输出结果为2,与题目要求一致,然后执行p++,使p指向第2个字符'2'。
显然第2次执行循环体输出结果为字符'3',符合题目要求。
第3次执行循环体输出字符是'4',也符合题目要求。
注意此时p已经指向字符串中的第4个字符'4',显然不能再执行循环体了,否则将输出字符'5'。
可以看出,所缺少的控制循环条件是当p指向字符串中第4个字符'4'时必须退出循环。
这个条件很容易写成“p指向的字符不是'4'”。
具体来说,这个条件表达式可以写成“*p!='4'”,也可以写成“*p<'4'”或者“*p<='3'”等等。
【答案】*p='4'或者*p<'4'或者即*p<='3'13 下列程序的功能是输入一个字符串存入字符数组a中,然后将其中的所有字符'\ DOWN'删除后再存入字符数组b,最后将字符数组b中的字符串输出。
请填写程序中缺少的语句。
#include”string.h”main(){ char a[81],b[8l],*p1=a,*p2=b;gets(p1);while(*p1='\0')if(*p1==‘\\')___________________else*p2++=*p1++;puts(b);}【分析】程序中的当型循环是完成删除数组a中存放的字符串中字符'\'的,分析控制这个循环的条件可知,这是依次处理存放在字符数组a中每个字符的标准程序段。