C语言学习笔记(5)

指针进阶

1. 指针数组

  • 一维指针数组的定义:

    类型名 *数组名[数组长度];

    char *color[5];

  • 指针数组是由指针变量构成的数组,在操作时,既可以直接对数组元素进行赋值(地址值)和引用。

2. 指向指针的指针

  • 指向指针的指针的定义

    类型名 **变量名

    int a = 10;
    int *p = &a;
    int **pp = &p;
    
  • 二级指针的操作

    int a = 10, b = 20, t;
    int *pa = &a, *pb = &b;
    int **ppa = &pa,  **ppb = &pb, **ppt;
    
  • 二维数组的指针形式
    二维数组是数组元素为一维数组的一维数组;
    二维数组a中三层次的指针等价关系:

    • 虽然a与 * a的值相同,但是含义不同。a是行元素的首地址,又称为行地址,是二级指针,而* a是首行第一个元素的地址,又称为列地址,是一级指针

    • 由于a[i]等价于 *(a+i)的关系,因此既可以用下标表示法,也可以用指针表示法,或者混合运用。例:

    a[i][j] <=> * ( *(a+i) + j) <=> *(a[i] + j)

  • 指针数组与二级指针

    与二维数组名类似,指针数组名也是二级指针,用数组下表能完成的操作,也能用指针完成

  • 采用动态内存的方法处理多个字符串的输入的优点在于,能够根据实际输入数据的多少来申请和分配内存空间,从而提高了内存的使用率。

  • 命令行参数

    命令行的一般形式

    ​ 命令名 参数1 ..... 参数 n

    命令名和各个参数之间用空格分隔,也可以没有参数

    在C语言程序中,主函数main( )可以有两个参数,用于接收命令行参

    int main (int argc, char *argv[])
    {
    ...
    }
    

    调用main( )时将命令有关的信息作为实参传递给两个参数

字符定位

1. 指针作为函数的返回值

  • 在C语言中,函数返回值的类型除了整型、字符型、和浮点型等基本数据类型外,也可以是指针,即函数可以返回一个地址

    注:不能在实现函数时返回在函数内部数据类型对象的地址,这是因为所有的局部数据对象在函数返回时就会消亡,其值不在有效。

  • 返回函数的一般都是全局数据对象或者主函数中对象的地址

2. 指向函数的指针

  • 在C语言中,函数名代表一个函数的入口地址。可以定义一个指针变量,接收函数的入口地址,让他指向函数,这就是指向函数的指针(函数指针)

  • 函数指针的定义

    ​ 类型名 (*变量名)(参数类型列表);

    类型名指函数返回值类型;

    变量名是指向函数的指针变量名称;

    int (*funptr)(int, int);
    // 定义了一个函数指针funptr
    //可以指向两个整型参数且返回值类型为int的函数
    
  • 通过函数指针调用函数

    在使用函数指针前,要先对它赋值。赋值时,将一个函数名赋值给函数指针但函数必须已定义或者声明,且函数返回值的数据类型和函数指针类型要一致

    通过函数指针调用函数的一般形式:

    (*函数指针名)(参数表);

3. 函数指针作为函数的参数

  • C语言调用中,函数名或已赋值的函数指针也能作为实参,此时,形参就是函数指针,它指向实参所代表的函数的入口地址。

我的手写笔记



我的代码









我的问题

1.二级指针操做



2.数组指针与指针数组

  • 指针数组:是指一个数组里面装着指针,也即指针数组是一个数组;
    定义形式:int *a[10];
  • 数组指针:是指一个指向数组的指针,它其实还是一个指针,只不过是指向数组而已;
    定义形式:int (* p)[10]; 其中,由于[]的优先级高于 * ,所以必须添加( * p).

PTA问题

1.strcat函数原型:

char *str_cat( char *s, char *t ){
char *ps=s ,*pt=t; 
while (*s!='\0')               
{
	*ps=*s;	
	s++;
	ps++;
}
while(*t !='\0'){
	*s++=*t++;
}
return s;
}
char *str_cat( char *s, char *t ){
	int a, i;
	a = strlen(s);
	for(i=0; *(t+i)!='\0'; i++)
    *(s+a+i) = *(t+i);
	return s;
}

char *str_cat( char *s, char *t ){
  int i,j;
  for(i=0;i<=strlen(s);i++)
  {
  	if(s[i]=='\0')
    {
  		for(j=0;j<strlen(t);j++,i++)
        {
  			s[i]=t[j];
  	   }
  		s[i]='\0';
  	}
  }
  return s;
}
posted @ 2020-04-12 21:50  ABClazyboy  阅读(288)  评论(0编辑  收藏  举报