C语言 指针
2020-04-05 16:54:51 62 举报
AI智能生成
对C语言指针课程的内容进行归纳总结
作者其他创作
大纲/内容
定义和初始化
定义:存放变量的地址
格式: 类型 *指针变量名
int *p;
char *p;
double *p;
float *p;
p 代表地址
*p 代表指针内所指的内容
*p 代表指针内所指的内容
指针与数组
指针和一维数组
通过指针访问一维数组
数组名就是数组的首地址:
int a[10],*p;
p=a;
a[i] 可表示为 a+i,也可表示为 p+i
int a[10],*p;
p=a;
a[i] 可表示为 a+i,也可表示为 p+i
注意:
1、p++表示正确
2、*p++等于*(p++);
3、*(p++)等价于a[0],,*(++p)等价于a[1],,,,但p均指向a[1]
4、(*p)++表示P所指的元素值+1
5、若p=&a[2],,则 *(++p)等价于a[3]
1、p++表示正确
2、*p++等于*(p++);
3、*(p++)等价于a[0],,*(++p)等价于a[1],,,,但p均指向a[1]
4、(*p)++表示P所指的元素值+1
5、若p=&a[2],,则 *(++p)等价于a[3]
通过首地址引用数组元素
*(a+i) 改变i
通过指针变量引用数组元素
不移动指针:
int a[5],i,*p;
p=a;
for(i=0;i<5;i++)
printf("%d",*(p++));
int a[5],i,*p;
p=a;
for(i=0;i<5;i++)
printf("%d",*(p++));
移动指针:
int a[5],i,*p;
p=a;
for(p=a;p<a+5;p++)
printf("%d",p);
int a[5],i,*p;
p=a;
for(p=a;p<a+5;p++)
printf("%d",p);
用带下标的指针变量引用数组元素
int a[5],i,*p;
p=a;
for(i=0;i<5;i++)
printf("%d",p[i]);
p=a;
for(i=0;i<5;i++)
printf("%d",p[i]);
函数中 一维数组名作为实参
1、形参和实参都用数组名:
main( )
{
int a[10];
.........
Fun(a,10);
}
Fun(int a[10],int n)
{
........
}
main( )
{
int a[10];
.........
Fun(a,10);
}
Fun(int a[10],int n)
{
........
}
2、实参用函数 名,兴蚕蛹指针变量:
main( )
{
int a[10];
.........
Fun(a,10);
}
Fun(int *p,int n)
{
.......
}
main( )
{
int a[10];
.........
Fun(a,10);
}
Fun(int *p,int n)
{
.......
}
3、实参和形参都用指针变量:
main( )
{
int a[10],*p;
p=a;
.........
Fun(a,10);
}
Fun(int *p,int n)
{
........
}
main( )
{
int a[10],*p;
p=a;
.........
Fun(a,10);
}
Fun(int *p,int n)
{
........
}
指针与二维数组
行指针和列指针
行指针:行指针是指向数组的指针
类型名 (*指针变量名)[二维数组的二维长度]
int a[2][3], (*P)[3];
a[i][j]可表示为:p[i][j]; *(p[i]+j);
*(*(p+i)+j); (*(p+i))[j]
类型名 (*指针变量名)[二维数组的二维长度]
int a[2][3], (*P)[3];
a[i][j]可表示为:p[i][j]; *(p[i]+j);
*(*(p+i)+j); (*(p+i))[j]
p=a 不合法
int *p[4];
int a[3][4];
p=a[0][0];
则p++=a[0][1];
int a[3][4];
p=a[0][0];
则p++=a[0][1];
列指针:int *p;
初始化:p=a[0]; p=*a; p=&a[0][0];
a[i][j]可表示为:*(p+i*n+j;)(n表示每行的容量);
&a[i][j]; p[i*n+j];
初始化:p=a[0]; p=*a; p=&a[0][0];
a[i][j]可表示为:*(p+i*n+j;)(n表示每行的容量);
&a[i][j]; p[i*n+j];
int *p;
int a[3][4];
p=*a;
则 p++=a[1][0];
int a[3][4];
p=*a;
则 p++=a[1][0];
函数中二维数组作为实参
主程序
main( )
{
int a[3][4];
.......
Fun(a);
........
}
{
int a[3][4];
.......
Fun(a);
........
}
函数程序
void Fun(int (*p)[4])
void Fun(int p[3][4])
void Fun(int p[ ][4])
指针与函数
函数间地址传递
借助指针变量返回多个值
函数指针
1、格式:
类型名(*函数指针变量名)()
int (*p)( );
类型名(*函数指针变量名)()
int (*p)( );
2、用函数名为指针赋值:
函数指针变量名=函数名
函数指针变量名=函数名
3、利用指向函数的指针变量调用函数
(* 函数指针变量名)(实参)
(* 函数指针变量名)(实参)
指针型函数:
返回值为指针类型的函数
返回值为指针类型的函数
类型名 * 函数名(参数表)
int Fun(int x,int y);
int Fun(int x,int y);
指针数组
类型名 *数组名[常量表达式]
char *ptr[4];
char *ptr[4];
指针的指针(二级指针)
存放指针变量的地址
存放指针变量的地址
类型符 **指针变量名
二级指针变量=&一级指针变量
int a,*p,**q;
p=&a;
q=&p;
int a,*p,**q;
p=&a;
q=&p;
指针的基本运算
1、取地址运算和间接访问运算
1、单目运算符(& 取地址)
2、‘*’可用于定义指针变量
或者访问指针所指的变量
或者访问指针所指的变量
int *p;
int a=3,p;
p=&a;
p=&a;
整形变量a 的地址赋值给整型指针p
指针p指向变量a
指针p指向变量a
2、指针变量的初始化
注意:1、可以用初始化的指针变量给另一个指针变量做初始值
2、不可用数值作为指针变量的初值,可以初始化为空
2、不可用数值作为指针变量的初值,可以初始化为空
int *p=NULL;
int *p='\0';
int *p=0;
int *p='\0';
int *p=0;
3、指针的基本运算
指针与数字的运算
指针p + 1就是代表指针向右移动一个单元格
指针p - 1就是代表指针向左移动一个单元格
指针p - 1就是代表指针向左移动一个单元格
指针与指针
指针加法无意义
指针减指针只能存在与同一个数组的两个指针中进行
指针减指针只能存在与同一个数组的两个指针中进行
*p++ :先取*p作为表达式,再将指针所指的变量的值+1
(*p)++:指针所指的变量值+1
(*p)++:指针所指的变量值+1
字符串
类型: 字符串+‘\0’
数组名代表数字的首地址
数组名代表数字的首地址
一维字符串数组:char str[6]={'H','e','l','l','o','\0'};
二维字符串数组:char a[2][5]={"Hello","name"};
二维字符串数组:char a[2][5]={"Hello","name"};
输入
scanf("%s",s);
gets(s);
fgets(字符数组名,范围,stbin);
输出
printf("%s",s);
puts(s);
通过指针访问字符串常量
通过指针访问字符数组
char *p="Hello";
或 char *p;
p="Hello";
char *p="Hello";
或 char *p;
p="Hello";
1、 *(ptr+i);相当于str[i]
2、 ptr++;移动指针
2、 ptr++;移动指针
1、 将字符串常量的首地址赋给指针变量
2、 通过移动指针变量依次访问字符串的每一个字符
2、 通过移动指针变量依次访问字符串的每一个字符
将初值置为空,避免野指针造成危险 char *p=NULL;
字符串函数的应用:
通过指针访问字符串数组
通过指针访问字符串数组
1. char * strcpy(char * s1, const char * s2) 把s2拷贝到s1,返回s1的值
2. char * strncpy(char * s1, const char * s2, size_t n) 拷贝s2中的n个字符到s1
3. char * strcat(char * s1, const char * s2) 把s2追加到s1后边
4. char * strncat(char * s1, const char * s2, size_t n) 把s2的n个字符追加到s1后
2. char * strncpy(char * s1, const char * s2, size_t n) 拷贝s2中的n个字符到s1
3. char * strcat(char * s1, const char * s2) 把s2追加到s1后边
4. char * strncat(char * s1, const char * s2, size_t n) 把s2的n个字符追加到s1后
从函数返回字符串指针
字符串作为函数参数
利用 ‘\0’判断字符串中的字符是否结束
主函数:
main( )
{
char s[100];
.........
Fun(s);
.........
}
main( )
{
char s[100];
.........
Fun(s);
.........
}
函数:
void Fun(char *p)
{
...........
}
void Fun(char *p)
{
...........
}
使用字符指针和使用字符数组处理字符串的区别
1、字符数组由若干元素组成,每个元素中放一个字符;
字符指针变量存放的是地址
字符指针变量存放的是地址
2、可以对字符指针变量赋值,但是不能对数组名赋值
char *a;
a = "I Love China!";
a = "I Love China!";
char parr[] = "zifuchuanshuzu";
char charr[] = { 'z','i','f','u' };
char charr[] = { 'z','i','f','u' };
3、对字符指针赋初值
char *a="I love China!";
等价于
char *a;
a="I love China!";
等价于
char *a;
a="I love China!";
注意:字符指针变量赋的字符串是一个常量,是不能改变的;
而字符数组的元素是可以改变的;
而字符数组的元素是可以改变的;
4、地址分配
数组:
char str[10];
scanf("%s",&str);
char str[10];
scanf("%s",&str);
指针:
char *a,str[10];
a=str;
scanf("%s",a);
char *a,str[10];
a=str;
scanf("%s",a);
5、从值的可变性来说
指针变量的值是可以改变的,就是地址的改变;
数组名的值是不能改变的,它只能指向本数组的首元素地址;
数组名的值是不能改变的,它只能指向本数组的首元素地址;
6、 数组元素的引用
字符数组可以用下标法:str[1];
地址法:*(str+1);
字符指针可以用指针变量带下标法:p[1]
地址法:*(str+1);
字符指针可以用指针变量带下标法:p[1]
7、从指向的内容值的角度看
字符数组内的元素,都是变量,值是可以改变的;
但是字符指针数组内的元素的值并不是变量而是常量,常量不能发生改变
但是字符指针数组内的元素的值并不是变量而是常量,常量不能发生改变
0 条评论
下一页