C语言编程精解-(5)-字符与存储

  • 字符串和字符类型数组的区别是什么?
  • 寄存器变量是什么,它有什么优势?
  • 局部变量与全局变量之间的区别是什么?

字符与字符串

1.重要的面试题

字符串和字符类型数组的区别是什么?
答:在默认情况下,字符串内存是静态分配的,因此它由NULL初始化.而字符数组的内存不是静态分配的,因此字符数组默认由垃圾数据填充;
两个相同的字符串有相同的内存地址,而两个内容一样的字符数组的内存地址却不一样.

2.重要的面试题

为什么字符串以‘\0’字符作为结尾?
答:字符串在内存中是逐字符顺序存储的,因此,在读取字符串时,需要知道字符串在何处结尾,处于这个目的,编译器会自动在字符串尾部追加‘\0’字符作为字符串结束的标志.

3.重要的面试题

长度为20的字符数组能存储多少个字符?
答:在C语言中,字符串以附加的‘\0’字符结尾,即最后一个字符空间留给‘\0’,所以只能存储19个字符.

3.程序 strcy()与strncpy()

/* 拷贝某字符串的前若干个字符串至s1中*/
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
    char s1[10],s2[50];
    int n;

    puts("Enter a string: ");
    gets(s2);

    puts("How many chars to copy?");
    scanf("%i",&n);
    strncpy(s1, s2, n);
    printf("The first %d chars are:%s",n,s1);
}

输出:

Enter a string:
Nageswara Rao
How many chars to copy?
3
The first 3 chars are: Nag

4.程序 strchr()

// 在字符串中查找指定字符串第一次出现的位置
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
    char str[100],ch;
    char *n;

    printf("Enter a string: ");
    gets(str);
    printf("Enter a character: ");
    ch = getchar();

    n = strchr(str, ch);
    if (n == NULL)
        printf("The character is not found");
    else
        printf("The first occurrence is %d",n-str);
}

输出:

Enter a string: Bottle
Enter a character: t
The first occurrence is 2

5.程序

// 在一个字符串中查找指定字符串首次出现的位置
// 在字符串中查找指定字符串第一次出现的位置
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
    char str[100],sub[20];
    char *n;

    printf("Enter main string: ");
    scanf("%[^\n]",str);
    fflush(stdin);

    printf("Enter sub string: ");
    scanf("%[^\n]",sub);

    n = strstr(str, sub);
    if (n == NULL)
        printf("sub string not found");
    else printf("Sub string is found at position %d",n-str);
}

输出:

Enter main string: This is book
Enter sub string: is
Sub string is found at position 2

6.程序

//  向函数传递一组字符串并在函数内显示它们
// 在字符串中查找指定字符串第一次出现的位置
#include <stdio.h>
#define MAX 50
void myfunction(char arr[MAX][MAX],int n){
    int i;
    for (i = 0; i<n; i++) {
        puts(arr[i]);
    }
}
int main(int argc, const char * argv[]) {
    char str[MAX][MAX];
    int i,n;
    printf("How many strings?");
    scanf("%i",&n);
    fflush(stdin);

    printf("Enter strings: \n");
    for (i = 0; i<n; i++) {
        gets(str[i]);
    }
    printf("Entered strings are: \n");
    myfunction(str, n);

}

存储类型

C中包含4种存储类型:自动存储类型(auto),寄存器存储类型(register),静态存储类型(static),外部存储类型(extern).

1.程序 帮助理解块或函数中变量的作用域

#include <stdio.h>
void function(){
    // 在函数中声明变量j,因此该变量仅在函数内部可见
    int j = 100;
    printf("\n%d",j);
}

int main(int argc, const char * argv[]) {
    {
        // 在块中声明变量i,因此,该变量仅在函数内部可见
        int i = 10;
        printf("\n%d",i);
    }
    printf("\n%d",i);   // 这里变量i不可见
    printf("\n%d",j);   // 这里变量j不可见
}

2.程序 auto存储类型 帮助理解自动变量的作用域

#include <stdio.h>
int main(int argc, const char * argv[]) {
    {
        // 代码块1开始
        auto int i = 100;
        {
            // 代码块2开始
            printf("\n%d",i);
        }   // 代码块2结束
        printf("\n%d",i);
        // 代码块2结束
    }
    printf("\n%d",i);   // 未定义符号i
}

3.程序 register 存储类型

// register存储类型
#include <stdio.h>
int main(){
    register int i;
    for(i = 0;i<10;i++){
        printf("%d ",i);
    }
}

输出:

0 1 2 3 4 5 6 7 8 9

4.重要的面试题

寄存器变量是什么,它有什么优势?
答:寄存器变量是变量值存储于CPU寄存器中的变量.寄存器变量访问速度快于其他变量,因为保存在CPU中,处理器可以即刻使用.

5.程序 static 存储类型

// 静态存储类型
#include <stdio.h>
void test(){
    static int i = 1;
    auto int j = 1;
    printf("\n%d\t%d",i++,j++);
}
int main(){
    test();
    test();
    test();
}

输出:

1    1
2    1
3    1

6.重要的面试题

static关键字的作用?
答:当使用关键字‘static’声明变量时,变量值会在函数调用之前保留;
当使用关键字“static”声明函数时,那么这个函数对其他源文件不可用;
一般而言,全局变量对于其他源文件可用,但是当声明为static时,对其他源文件不可用.

7.程序 extern 存储类型 帮助理解外部变量特性

// 外部存储类型
#include <stdio.h>
int x;  // 这是一个全局变量
void one(){
    x++;
    printf("\nx in one = %d",x);
}
void two(){
    x++;
    printf("\nx in main = %d",x);
}
int main(){
    printf("\nx in main = %d",x);
    one();
    two();
}

输出:

x in main = 0
x in one = 1
x in main = 2

8.程序 为了使用全局变量,在函数中使用关键字“extern”

// 外部存储类型
#include <stdio.h>
int x = 10;  // 这是一个全局变量
void one(){
    extern int x;
    x++;
    printf("\nx in one = %d",x);
}
void two(){
    extern int x;
    x++;
    printf("\nx in main = %d",x);
}
int main(){
    extern int x;
    printf("\nx in main = %d",x);
    one();
    two();
}

输出:

x in main = 10
x in one = 11
x in main = 12

9.程序 局部变量

// 外部存储类型
#include <stdio.h>
int x = 10;  // 这是一个全局变量
void one(){
    int x = 20;
    printf("\nx in one = %d",x);
}
void two(){
    extern int x;   // 这是一个全局变量
    printf("\nx in two = %d",x);
}
int main(){
    extern int x;   // 引用全局变量
    printf("\nx in main = %d",x);
    one();
    two();
}

输出:

x in main = 10
x in one = 20
x in two = 10

10.重要的面试题

局部变量与全局变量之间的区别是什么?
答:局部变量是声明在块或函数内部的变量.局部变量的作用域局限于该块或者函数.局部变量如果没有初始化,将包含垃圾数据;
全局变量在所以块和函数之前声明的变量.全局变量对所有在它之后声明的函数有效.全局变量使用默认值初始化,如0;


 上一篇
C语言编程精解-(6)-指针1 C语言编程精解-(6)-指针1
函数malloc()与函数calloc()有什么区别? 如何使用指针访问二维数组中的数据元素? 指针1.程序 指针// 如何使用指针 #include <stdio.h> int main(int argc, const
2019-03-18
下一篇 
放毒-来大一波美食! 放毒-来大一波美食!
余生所求,做有趣的人,交有趣的朋友,去有趣的地方,过有趣的人生,最烈的酒,睡最美的姑娘!!! 余生无所求,做有趣的人,交有趣的朋友,去有趣的地方,过有趣的人生,最烈的酒,睡最美的姑娘!!!
2019-03-15
  目录