指针进阶
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!=' ')
{
*ps=*s;
s++;
ps++;
}
while(*t !=' '){
*s++=*t++;
}
return s;
}
char *str_cat( char *s, char *t ){
int a, i;
a = strlen(s);
for(i=0; *(t+i)!=' '; 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]==' ')
{
for(j=0;j<strlen(t);j++,i++)
{
s[i]=t[j];
}
s[i]=' ';
}
}
return s;
}