如下语句中实现数组指针声明的是? A. (char *)s[10]; B. char *s[10]; c.char *s[0]; D. char (*s)[10];
时间: 2023-03-27 20:01:09 浏览: 81
正确的是 B. char *s[10]。
这表示声明了一个名为 s 的数组,数组的每一个元素都是一个指向 char 类型的指针。也就是说,s 是一个数组指针。
A. (char *)s[10] 是错误的,因为它将 (char *) 应用于 s[10],而不是 s。
c. char *s[0] 是错误的,因为数组的大小不能为 0。
D. char (*s)[10] 是正确的,它声明了一个名为 s 的指针,指向一个包含 10 个 char 类型元素的数组。
相关问题
假设scanf语句执行时输入abcde<回车>,能使puts(s)语句正确输出abcde字符串的程序段是__。 a. char s[5]={"abcde"}; puts(s); b. char s[5]={'a', 'b', 'c', 'd', 'e'}; puts(s); c. char *s; scanf("%s", s); puts(s); d. char *s; s="abcde"; puts(s);
### 回答1:
正确答案是d. char *s; s="abcde"; puts(s);。只有d选项中的字符指针s被正确地赋值为字符串常量"abcde",并且字符串常量不需要使用大括号或引号转义。其他选项有错误或不确定性。选项a中缺少字符串结束符'\0',选项b可能导致字符串不以'\0'结尾,
选项c需要为字符指针s分配内存空间。
### 回答2:
正确答案是c. char *s; scanf("%s", s); puts(s);
解析如下:
选项a和b都声明了一个字符数组s,但是在初始化时只分配了5个空间,实际上字符串要占用6个空间(1个空间存放\0),会导致字符数组溢出,结果无法预料。
选项d声明了一个字符指针s,并将s赋值为"abcde",这样的做法有两个问题:一是没有给字符数组分配空间,如果尝试向s指向的内存位置写入数据,会发生不可知的错误;二是字符串"abcde"可能存储在只读内存中,不支持写操作,尝试修改会发生段错误。
选项c是正确答案,声明了一个字符指针s,并通过scanf函数从控制台读取字符串,字符串会被存储在动态内存中,可以任意修改。需要注意的是,使用前必须对s进行内存分配,可以使用malloc函数或者静态声明来分配。例如:
char *s = (char*)malloc(sizeof(char) * 6); //分配6个字符空间,用于存放"abcde\0"
scanf("%s", s); //从控制台读取字符串
puts(s); //输出字符串
free(s); //释放动态内存
总之,对字符数组的处理必须谨慎,避免发生数组溢出、指针非法访问等错误。动态内存分配可以解决空间不足的问题,但也需要注意内存泄漏、多线程同步等问题,使用时应该根据应用场景综合考虑。
### 回答3:
正确答案是c. char *s; scanf("%s", s); puts(s);。
在代码段a和b中,数组s的空间已经被初始化为"abcde"或{'a', 'b', 'c', 'd', 'e'},如果我们在执行scanf语句时输入abcde,它们仅会覆盖s中的"a"字符,因此puts(s)函数输出的字符串将不是我们期望的'abcde'。
在代码段d中,我们试图用指针s指向字符串"abcde",但是s仅仅指向了这个字符串所在的内存地址,我们并没有为s分配空间存储它指向的字符串,因此puts(s)函数可能输出一个意想不到的结果或直接导致程序崩溃。
正确的做法是先为字符指针s分配足够的空间,可以使用静态分配或动态分配的方式,然后再利用scanf语句将输入的字符串复制到这个空间中,最后使用puts函数输出这个字符串。因此,代码段c是正确的,它首先声明了一个字符指针s,然后在scanf语句中使用%s格式化字符串输入函数读取输入的字符串,并将其复制到s指向的内存空间中,最后使用puts函数输出这个字符串。
char * s_gets (char * st,int n);这个语句的作用是什么
这个语句的作用是定义了一个名为 `s_gets` 的函数,它接受一个指向字符数组的指针 `st` 和一个整数 `n` 作为参数,并且返回一个指向字符的指针。这个函数通常用于获取用户输入的字符串,并且可以限制字符串的最大长度为 `n-1`。它会读取用户输入的字符串,直到遇到换行符或者达到最大长度。返回的指针指向输入的字符串(包括换行符),或者在输入为空时返回空指针。