C语言字符串指针问题

合集下载

C语言中指针和字符串的辩证

C语言中指针和字符串的辩证
pit " d rs o t %# ,t % \” tpr / ts 的 地 址 会 r f( des f r xpr n A :s = = n,r t;/ rt s , ) p ,r 怎样 呢 ?
} 运行结果 :
d i e o f: s  ̄ O l f 7 t 铂 x 2 f 4 tr  ̄ o t = x 2 f 4 p r 1 f 7
[ 键词 ] 针 关 指 字 符 串 地 址 t的
1揭 开 指 针 的面 纱 . C语 言 的 学 习过 程 中 , 指针 一 直都 被 公 认 为 是 最 大 的一 个 难 点 , 然 而 由于 指 针 使 用 方 便 灵 活 且 功 能 强 大 ,往 往 有 不 学 指 针 就 根 本 没 有 学 过 C语 言 之 说 。 们通 常 用尽 心 思 做 各 种 测 试 , 我 以为 自 己对 指 针 已经 驾
科技信息
博士・ 专家论 坛
C语 言 巾指 针 和字 衢 串 硇 辩i 正
常 州大 学信 息科 学与 工程 学 院 林 荫
[ 摘 要 ] 为 C语 言中一个非 常重要的数据类型 , 作 指针使用灵活 , 功能强大 , 由此 产生了难以理解和容 易错 用的问题 。本文列举 也 了指针指向字符 串时产生的问题 , 用地 址追溯法分析 了问题产 生的原 因 , 出了问题 的解 决方案并可进行应 用引中, 使 提 对解&-' tC  ̄f 使 用 中的 其 它 问题 有很 好 的借 鉴 意 义 。
轻就熟 , 但使用时仍不时掉进指针的泥潭 , 本文 中研究 的指针和字符 串 的关 系 即为 一 例 。 指针就是地址 , 我们 可 以把 地 址 看 做 是 一 种 特 别 的 数 据 类 型 。指 针 变量也是变量 , 只不过只能存放 地址类 型的数据 , 以称为是地址 型变 可 量。当变量只 占一个 字节时 , 变量的地址就是变量 的地址 ; 该 当变量 占 用 连 续 的 若 干个 字节 时 , 一 个 字 节 的地 址 就 是 该 变 量 的 地 址 。本 文 基 第 于 Widw P操作 系统 、 60编译环境进行实验验证。看以下示例 : nos X VC . 示例 1 指向简单类型变量 的指针 :

C语言指针经典练习题-及答案

C语言指针经典练习题-及答案

C语言指针练习题及答案一、选择题1. 变量的指针,其含义是指该变量的____.a)值b)地址c)名d)一个标志2.若有语句int *point,a=4;和point=&a;下面均代表地址的一组选项是__ _.a)a,point,*&a b)&*a,&a,*pointc)*&point,*point,&a d)&a,&*point ,point3.若有说明;int *p,m=5,n;以下正确的程序段的是________.a)p=&n; b)p=&n;scanf("%d",&p); scanf("%d",*p);c)scanf("%d",&n); d)p=&n;*p=n; *p=m;4. 以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是__ _____.main(){int *p,*q,a,b;p=&a;printf(“input a:”);scanf(“%d”,*p);……}a)*p表示的是指针变量p的地址b)*p表示的是变量a的值,而不是变量a的地址c)*p表示的是指针变量p的值d)*p只能用来说明p是一个指针变量5. 已有变量定义和函数调用语句:int a=25; print_value(&a); 下面函数的正确输出结果是______.void print_value(int *x){ printf(“%d\n”,++*x);}a)23 b)24 c)25 d)266.若有说明:long *p,a;则不能通过scanf语句正确给输入项读入数据的程序段是A) *p=&a;scanf("%ld",p);B) p=(long *)malloc(8);scanf("%ld",p);C) scanf("%ld",p=&a);D) scanf("%ld",&a);7.有以下程序#include<stdio.h>main(){ int m=1,n=2,*p=&m,*q=&n,*r;r=p;p=q;q=r;printf("%d,%d,%d,%d\n",m,n,*p,*q);}程序运行后的输出结果是A)1,2,1,2 B)1,2,2,1C)2,1,2,1 D)2,1,1,28. 有以下程序main(){ int a=1, b=3, c=5;int *p1=&a, *p2=&b, *p=&c;*p =*p1*(*p2);printf("%d\n",c);}执行后的输出结果是A)1 B)2 C)3 D)49. 有以下程序main(){ int a,k=4,m=4,*p1=&k,*p2=&m;a=p1==&m;printf("%d\n",a);}程序运行后的输出结果是()A)4 B)1 C)0 D)运行时出错,无定值10. 在16位编译系统上,若有定义int a[]={10,20,30}, *p=&a;,当执行p++;后,下列说法错误的是()A)p向高地址移了一个字节B)p向高地址移了一个存储单元C)p向高地址移了两个字节D)p与a+1等价11.有以下程序段int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3], b; b=p[5]; b中的值是()A)5 B)6 C)8 D)912.若有以下定义,则对a数组元素的正确引用是_________.int a[5],*p=a;a)*&a[5] b)a+2 c)*(p+5) d)*(a+2)13.若有以下定义,则p+5表示_______.int a[10],*p=a;a)元素a[5]的地址b)元素a[5]的值c)元素a[6]的地址d)元素a[6]的值14.设已有定义: int a[10]={15,12,7,31,47,20,16,28,13,19},*p; 下列语句中正确的是()A) for(p=a;a<(p+10);a++);B) for(p=a;p<(a+10);p++);C) for(p=a,a=a+10;p<a;p++);D) for(p=a;a<p+10; ++a);15.有以下程序段#include <stdio.h>int main(){ int x[] = {10, 20, 30};int *px = x;printf("%d,", ++*px); printf("%d,", *px);px = x;printf("%d,", (*px)++); printf("%d,", *px);px = x;printf("%d,", *px++); printf("%d,", *px);px = x;printf("%d,", *++px); printf("%d\n", *px);return 0;}程序运行后的输出结果是( )A)11,11,11,12,12,20,20,20 B)20,10,11,10,11,10,11,10C)11,11,11,12,12,13,20,20 D)20,10,11,20,11,12,20,2016.设有如下定义则程序段的输出结果为int arr[]={6,7,8,9,10};int *ptr;ptr=arr;*(ptr+2)+=2;printf ("%d,%d\n",*ptr,*(ptr+2));A)8,10 B)6,8 C)7,9 D)6,1017.若有定义:int a[]={2,4,6,8,10,12},*p=a;则*(p+1)的值是_4__. *(a+5)的值是__12__.18.若有以下说明和语句,int c[4][5],(*p)[5];p=c;能正确引用c数组元素的是___ __.A) p+1 B) *(p+3) C) *(p+1)+3 D) *(p[0]+2))19.若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为__ __.a)*(a[i]+j) b)(a+i) c)*(a+j) d)a[i]+j20.若有以下定义:int a[2][3]={2,4,6,8,10,12};则a[1][0]的值是_8_. *(*(a+1)+0)的值是_ _8.21.有以下定义char a[10],*b=a; 不能给数组a输入字符串的语句是()A)gets(a) B)gets(a[0]) C)gets(&a[0]); D)gets(b);22.下面程序段的运行结果是___ __.char *s="abcde";s+=2;printf("%d",s);a)cde b)字符'c' c)字符'c'的地址d)无确定的输出结果23.以下程序段中,不能正确赋字符串(编译时系统会提示错误)的是()A) char s[10]="abcdefg"; B) char t[]="abcdefg",*s=t;C) char s[10];s="abcdefg"; D) char s[10];strcpy(s,"abcdefg");24.设已有定义: char *st="how are you"; 下列程序段中正确的是()A) char a[11], *p; strcpy(p=a+1,&st[4]);B) char a[11]; strcpy(++a, st);C) char a[11]; strcpy(a, st);D) char a[], *p; strcpy(p=&a[1],st+2);25.有以下程序输出结果是()main(){char a[]="programming",b[]="language";char *p1,*p2;p1=a;p2=b;for(i=0;i<7;i++)if(*(p1+i)==*(p2+i))printf("%c",*(p1+i));}A)gm B)rg C)or D)ga26.设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是_____.a)c=*p1+*p2; b)p2=c c)p1=p2 d)c=*p1*(*p2);27.以下正确的程序段是____.a)char str[20]; b)char *p;scanf("%s",&str); scanf("%s",p);c)char str[20]; d)char str[20],*p=str;scanf("%s",&str[2]); scanf("%s",p[2]);28.若有说明语句则以下不正确的叙述是____.char a[]="It is mine";char *p="It is mine";a)a+1表示的是字符t的地址b)p指向另外的字符串时,字符串的长度不受限制c)p变量中存放的地址值可以改变d)a中只能存放10个字符29.下面程序的运行结果是___.#include <stdio.h>#include <string.h>main(){ char *s1="AbDeG";char *s2="AbdEg";s1+=2;s2+=2;printf("%d\n",strcmp(s1,s2));}a)正数b)负数c)零d)不确定的值30.有以下程序运行后的输出结果是____。

C语言技术的常见问题及解决方案

C语言技术的常见问题及解决方案

C语言技术的常见问题及解决方案C语言作为一门广泛应用于软件开发和系统编程的编程语言,常常出现一些问题困扰开发者。

本文将讨论一些常见的C语言技术问题,并提供相应的解决方案。

问题一:内存泄漏在C语言编程中,内存泄漏是一个常见但又令人头疼的问题。

内存泄漏指的是在动态内存分配之后,没有正确释放该内存导致系统无法再次使用。

解决方案:为了避免内存泄漏,必须始终确保在使用完动态分配的内存后进行释放。

使用free函数来释放之前使用malloc或calloc函数分配的内存块。

此外,应该避免在循环中重复分配内存,以免造成内存泄漏和性能问题。

问题二:指针问题指针是C语言的一个重要特性,但也常常出现一些问题。

指针问题包括未初始化指针、指针越界、野指针等。

解决方案:避免指针问题的关键是始终确保指针的正确初始化和使用。

在声明指针变量时,应该将其初始化为NULL以避免成为野指针。

另外,访问指针指向的内存时,应该确保不越界,可以通过检查指针是否为NULL或使用合适的边界检查来避免越界访问。

问题三:数组越界访问数组越界访问是指在访问数组元素时超出了数组的有效范围。

这会导致不可预测的结果,包括程序崩溃和数据损坏等问题。

解决方案:为了避免数组越界访问,开发者需要在编写代码时严格遵守数组索引的范围。

在使用循环或指针遍历数组时,必须确保不超过数组的边界。

在进行数组操作时,使用合适的条件判断语句来控制访问边界。

问题四:类型不匹配C语言是一种静态类型语言,要求变量的类型在声明时就确定并且不能更改。

类型不匹配问题包括不同类型之间的赋值错误、函数参数类型错误等。

解决方案:为了避免类型不匹配问题,开发者需要严格遵守变量类型的规定。

在进行变量赋值时,确保变量的类型匹配。

在使用函数时,检查函数参数的类型是否与函数声明一致,并根据需要进行合适的类型转换。

问题五:死循环死循环是指程序中的循环不会结束,导致程序陷入无限循环的状态。

这常常是由于循环条件错误或循环体内没有引入适当的循环退出条件造成的。

c语言常见问题集

c语言常见问题集

c语言常见问题集C语言作为一种古老而强大的编程语言,在使用过程中可能会遇到各种常见问题。

以下是一些C语言常见问题及解决方法的集合:1.指针问题:问题:指针使用不当导致内存泄漏或段错误。

解决方法:谨慎使用指针,确保正确的内存分配和释放,避免野指针。

2.内存泄漏:问题:未正确释放动态分配的内存。

解决方法:在不再使用内存时,使用free函数释放动态分配的内存。

3.数组越界:问题:访问数组元素时超出了数组边界。

解决方法:确保数组索引在合法范围内,使用循环时注意控制循环边界。

4.未初始化变量:问题:使用未初始化的变量。

解决方法:在使用变量之前确保对其进行初始化,避免产生未定义行为。

5.逻辑错误:问题:程序的输出与预期不符。

解决方法:仔细检查代码逻辑,使用调试工具进行单步调试,查找错误的源头。

6.编译错误:问题:编译时出现错误。

解决方法:仔细阅读编译器报错信息,检查代码语法错误,确保使用正确的语法和标准库函数。

7.字符串处理问题:问题:字符串操作时未考虑字符串结束符\0。

解决方法:确保字符串以\0结尾,使用字符串处理函数时注意边界条件。

8.文件操作问题:问题:未正确打开、关闭文件,或者在未打开文件的情况下进行文件操作。

解决方法:在使用文件之前确保正确打开,使用完毕后关闭文件,检查文件是否成功打开。

9.结构体使用问题:问题:结构体成员的访问不当。

解决方法:确保使用正确的结构体成员名,避免结构体成员越界访问。

10.数据类型不匹配:-问题:不同数据类型之间的不匹配导致错误。

-解决方法:确保进行运算或赋值时,数据类型一致或符合隐式转换规则。

以上问题及解决方法提供了一些基本的指导,但在实际编码中,关键在于谨慎、仔细和严谨,同时善用调试工具和编程工具,及时修复潜在问题。

c语言 char 指针用法 -回复

c语言 char 指针用法 -回复

c语言char 指针用法-回复C语言中的char指针是一种非常重要且常用的数据类型。

它提供了表示和操作字符串的便捷方式。

在本篇文章中,我将一步一步回答关于char指针的用法的问题。

首先,我们需要了解char指针的基本概念。

char指针是一个指向字符数据的指针,它存储了字符数据在内存中的地址。

通过使用char指针,我们可以方便地遍历和修改字符串中的字符。

那么,如何声明和初始化char指针呢?在C语言中,可以使用以下语法声明和初始化char指针:cchar *ptr;char str[] = "Hello World";ptr = str;在上面的代码片段中,我们首先声明了一个名为ptr的char指针。

然后,我们声明了一个名为str的字符数组,并将字符串"Hello World"赋值给它。

接下来,我们将str的地址赋值给ptr,这样ptr就指向了str这个字符串。

通过char指针,我们可以很方便地访问字符串中的每个字符。

我们可以使用以下语法来访问char指针指向的字符:cchar ch = *ptr;上面的代码将会把ptr指向的字符赋值给ch。

我们也可以通过对char指针进行加法运算来访问字符串中的下一个字符:cptr++;char next_ch = *ptr;上面的代码将char指针ptr指向字符串中的下一个字符,并将其赋值给next_ch。

通过不断对char指针进行加法运算,我们可以遍历整个字符串。

除了访问字符串中的字符,我们还可以通过char指针修改字符串。

可以使用以下语法将一个字符赋值给char指针指向的位置:c*ptr = 'a';上面的代码将会把字符'a'赋值给ptr指向的位置。

通过对char指针进行加法运算,我们也可以依次修改字符串中的每个字符。

在讲解了基本的char指针用法之后,让我们进一步探讨char指针和字符串之间的关系。

c语言面试题__指针篇

c语言面试题__指针篇

c语言面试题__指针篇c语言面试题__指针篇1. char * const p;char const * pconst char *p上述三个有什么区别?char * const p; //常量指针,p的值不可以修改char const * p;//指向常量的指针,指向的常量值不可以改const char *p; //和char const *p------------------------------------------------------2. char str1[] = "abc";char str2[] = "abc";const char str3[] = "abc";const char str4[] = "abc";const char *str5 = "abc";const char *str6 = "abc";char *str7 = "abc";char *str8 = "abc";cout << ( str1 == str2 ) << endl;cout << ( str3 == str4 ) << endl;cout << ( str5 == str6 ) << endl;cout << ( str7 == str8 ) << endl;打印结果是什么?解答:结果是:0 0 1 1str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域-----------------------------------------------3. 以下代码中的两个sizeof用法有问题吗?void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母{for( size_t i=0; i<="str[i]" )="" )<="" ++i="" if(="" p="" sizeof(str[0]);="" str[i]<="z">str[i] -= ('a'-'A' );}char str[] = "aBcDe";cout << "str字符长度为: " << sizeof(str)/sizeof(str[0]) << endl;UpperCase( str );cout << str << endl;答:函数内的sizeof有问题。

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:将一个整数数组按升序排序。

c语言 指针编程题

c语言 指针编程题

c语言指针编程题以下是一个简单的C语言指针编程题,可以通过指针操作实现字符串的反转:```c#include <stdio.h>#include <string.h>void reverseString(char* str) {int i, j;char temp;for (i = 0, j = strlen(str) - 1; i < j; i++, j--) {temp = str[i];str[i] = str[j];str[j] = temp;}}int main() {char str[] = "Hello, world!";printf("Original string: %s\n", str);reverseString(str);printf("Reversed string: %s\n", str);return 0;}```在这个程序中,我们定义了一个名为`reverseString`的函数,该函数接受一个字符串作为参数,并通过指针操作实现字符串的反转。

具体来说,我们使用两个指针i和j来遍历字符串,将i指向的字符与j指向的字符交换位置,直到i指向字符串的第一个字符,j指向字符串的最后一个字符为止。

在主函数中,我们定义了一个字符串`str`,并调用`reverseString`函数来反转该字符串。

最后,我们输出反转后的字符串和原始字符串,以便进行比较和验证。

需要注意的是,在使用指针操作时,一定要确保指针指向的内存区域已经分配并且不会被释放,否则可能导致程序崩溃或数据损坏。

同时,在使用指针操作时,还需要注意指针的类型和大小,以确保指针操作的正确性和有效性。

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

C语言字符串指针问题
在C语言中,可以用两种方法访问一个字符串。

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

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

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

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

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

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

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

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

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

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

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

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

在输入的字符串中查找有无‘k’字符。

1.main(){
2.char st[20],*ps;
3.int i;
4.printf("input a string:\n");
5.ps=st;
6.scanf("%s",ps);
7.for(i=0;ps[i]!='\0';i++)
8.if(ps[i]=='k'){
9.printf("there is a 'k' in the string\n");
10.break;
11.}
12.if(ps[i]=='\0') printf("There is no 'k' in the string\n");
13.}
本例是将指针变量指向一个格式字符串,用在printf函数中,用于输出二维数组的各种地址表示的值。

但在printf语句中用指针变量PF 代替了格式串。

这也是程序中常用的方法。

1.main(){
2.static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
3.char *PF;
4.PF="%d,%d,%d,%d,%d\n";
5.printf(PF,a,*a,a[0],&a[0],&a[0][0]);
6.printf(PF,a+1,*(a+1),a[1],&a[1],&a[1][0]);
7.printf(PF,a+2,*(a+2),a[2],&a[2],&a[2][0]);
8.printf("%d,%d\n",a[1]+1,*(a+1)+1);
9.printf("%d,%d\n",*(a[1]+1),*(*(a+1)+1));
10.}
本例是把字符串指针作为函数参数的使用。

要求把一个字符串的内容复制到另一个字符串中,并且不能使用strcpy函数。

函数cprstr的形参为两个字符指针变量。

pss指向源字符串,pds指向目标字符串。

注意表达式:(*pds=*pss)!=`\0'的用法。

1.cpystr(char *pss,char *pds){
2.while((*pds=*pss)!='\0'){
3.pds++;
4.pss++;
5.}
6.}
7.main(){
8.char *pa="CHINA",b[10],*pb;
9.pb=b;
10.cpystr(pa,pb);
11.printf("string a=%s\nstring b=%s\n",pa,pb);
12.}
在本例中,程序完成了两项工作:一是把pss指向的源字符串复制到pds所指向的目标字符串中,二是判断所复制的字符是否为`\0',若是则表明源字符串结束,不再循环。

否则,pds和pss都加1,指向下一字符。

在主函数中,以指针变量pa,pb为实参,分别取得确定值后调用cprstr函数。

由于采用的指针变量pa和pss,pb和pds均指向同一字符串,因此在主函数和cprstr函数中均可使用这些字符串。

也可以把cprstr函数简化为以下形式:
cprstr(char *pss,char*pds)
{while ((*pds++=*pss++)!=`\0');}
即把指针的移动和赋值合并在一个语句中。

进一步分析还可发现`\0'的ASCⅡ码为0,对于while语句只看表达式的值为非0就循环,为0则结束循环,因此也可省去“!=`\0'”这一判断部分,而写为以下
形式:
cprstr (char *pss,char *pds)
{while (*pdss++=*pss++);}
表达式的意义可解释为,源字符向目标字符赋值,移动指针,若所赋值为非0则循环,否则结束循环。

这样使程序更加简洁。

简化后的程序如下所示。

1.cpystr(char *pss,char *pds){
2.while(*pds++=*pss++);
3.}
4.main(){
5.char *pa="CHINA",b[10],*pb;
6.pb=b;
7.cpystr(pa,pb);
8.printf("string a=%s\nstring b=%s\n",pa,pb);
9.}。

相关文档
最新文档