C语言关于指针,gets()和gets_s()函数的理解

使用const修饰一个指针

int a[5] = {0, 1, 2, 3, 4};
//第一种,指针p1不能修改指向地址上的值。
const int * p1 = a;
//第二种,指针p2不能更改它所指向的地址。
int * const p2 = a;
//第三种,指针p3既不能修改指向地址上的值,也不能更改它所指向的地址。
const int * const p3 =a;

二维指针

  1. 二维指针的两种声明。

    int (*p)[4];	//声明数组指针,意为指向数组的指针。加括号是因为[]的优先级高于*
    int * p[4];	    //声明指针数组,意为声明了一个含有4个指针的数组,数组中每个元素都是指针
    
  2. 二维地址转换的一些等价关系,可以方便理解行地址、列地址。

    a[x] == *(a+x)
    a[x][y] == *(*(a+x) + y)

  3. 二维数组数组地址、数组内容和指针之间的关系图。
    在这里插入图片描述

  4. 二维数组的行地址、列地址关系图。
    在这里插入图片描述

指针函数和函数指针

指针函数就是返回类型是指针的函数。例如:

int * fun(int x,int y);		//声明了一个返回指向int类型的指针的指针函数

函数指针,其本质是一个指针变量,该指针指向一个函数。例如:

int add(int x,int y){
    return x+y;
}
int (*fun)(int x,int y);	//函数指针
int main(){
    fun = add;
    int res = (*fun)(1,2);	//res结果是3
    return 0;
}

gets()函数与gets_s()函数

gets()函数是不幸的,由于gets()唯一的参数words无法检查数组是否装得下内存。gets()只知道数组的开始处,并不知道数组中有多少个元素。如果输入的字符串过长,会导致缓冲区溢出,即多余的字符超出了指定的目标空间。如果这些多余的字符只是占用了尚未使用的内存,就不会立即出现问题;如果它们擦写掉程序中的其他数据,会导致程序异常。因此,在C11标准中已经废除了gets()函数,即使它有时候非常好用。在PTA平台上交C/C++代码时,如果使用了gets()函数也会报错。

gets_s()可作为gets()函数的替代品,它的完整形式是:
gets(words,LEN);
限制了读书字符串的长度。如果读到换行符,就会舍弃它并且停止。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页