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