导图社区 指针
C语言指针详解,包括地址和指针、指针的使用、指针和字符串、函数参数的传递、指针和数组、指针和函数、多级指针等等。
编辑于2022-11-20 11:05:50 河南指针
地址和指针
地址
现实:二七区民主路6号华健商务大厦12楼
c语言:给内存空间进行编号,单位是字节
指针
数据类型,指针变量用来存放地址
除了变量名,其余的都是数据类型
指针的使用
定义
数据类型 *指针名;
数据类型:指针指向空间的数据类型
*:代表定义出来的是一个指针变量
int *p;//定义一个整形指针,该指针可以指向一个整形空间
初始化
int a; int *p = &a;
赋值
int a; int *p; p = &a;
调用
int a = 10,b; int *p = &a; b = *p;//b = a; *指针运算符,访问指针指向的空间
&:取地址
*:取内容
空指针
int *p = 0;
int *p = NULL;
指向0地址单元的指针
野指针
指针指向的空间未知,如果该空间存放系统文件,对其修改会使系统崩溃,所有要避免出现野指针
指针的大小
32位编译环境下,指针的大小为4个字节(32位)
指针和字符串
c语言允许用一个字符串初始化一个指针
char *p = "hello";
char *p="hello world"; 在文本常量区里面,且不可修改。
*p = 'H';//错误
字符串是常量,只读不能修改
char str[20] = "hello"; char *p = str; *p = 'H';//正确
函数参数的传递
值传递
传递的是一个普通变量,子函数不能改变实参的值
地址传递
传递的是一个地址,子函数可以通过该地址访问实参
#include int fun(int a); void fun2(int *p); int main() { int b=10; fun(b); printf("b = %d\n",b); fun2(&b); printf("b = %d\n",b); } int fun(int a) { a = 100; } void fun2(int *p) { *p = 100; }
指针和数组
指针指向一个数组的两种方法
#include int main() { int num[5]; int i; int *p=num; for(i=0;i { //scanf("%d",&num[i]); scanf("%d",(p+i)); } for(i=0;i { printf("%-3d",*(p+i)); } return 0; }
int num[5]={1,2,3,4,5};
int *p = num;
int *p = &num[0];
*p == 1 *(p+1) == 2
指针+1,指针内存放的地址+指针指向空间数据类型的大小
二维数组指针
数组类型的指针(二维数组)
定义:类型 (*标志符)[数组长度];
类型:指向数组的类型
数组长度:指向数组的长度
例如: int num[3][4]; int (*pnum)[4];
1 #include "stdio.h" 2 3 int main(void) 4 { 5 int num[2][3]={{1,2,3},{4,5,6}}; 6 int (*pnum)[3] = NULL; 7 int i,j; 8 //指向num 9 pnum = num; 10 //打印第0行0列的元素 11 printf("num[0][0]=%d\n",num[0][0]); 12 //打印第1行0列的元素 13 printf("num[1][0]=%d\n",num[1][0]); 14 //指针表示: 15 for(i=0;i 16 { 17 for(j=0;j 18 { 19 printf("%-3d",*(*(pnum+i)+j)); printf("%-3d",(*(pnum+i))[j]); 20 } 21 printf("\n"); 22 } 23 return 0; 24 }
指针数组
就是一个数组,数组的每一个元素都是一个指针
#include int main() { int i; char *p[3] = {"hello","abc","world"}; for(i=0;i { printf("%s\n",p[i]); } printf("%d\n",sizeof(p)); return 0; }
char *p[3] = {"hello","abc","world"};
指针和函数
指针函数
就是一个函数,函数的返回值为指针
注意:函数的返回值必须有意义
#include char* fun(void); int main() { char *p; p = fun(); printf("%s\n",p); return 0; } /*指针函数*/ char* fun(void) { /*如果不把str定义为static类型,子函数运行结束之后str的内存空间会被自动释放,所以要加上static*/ static char str[20] = "hello"; return str; }
函数指针
就是一个指针,指向一个函数
返回值类型 (*指针名) (参数类型)
#include int fun(int a); int main() { /*函数指针*/ int (*p)(int); p = fun; p(3);//fun(3); return 0; } int fun(int a) { printf("%d\n",a); }
多级指针
指针指向的空间还是一个指针
int a=10; int *p = &a; int **q = &p;
a &a *p *q **q &p
多级指针演示
#include int main() { int a = 10; int *p = &a; int **pp = &p; printf("%d %d %d\n",a,*p,**pp); printf("%p %p %p\n",p,*pp,&a); printf("%p %p\n",pp,&p); printf("%p\n",&pp); return 0; } /*程序运行结果*/ /*由于程序存储位置不同,所以不同的电脑运行的地址结果不一致*/ 10 10 10 0xbff456a0 0xbff456a0 0xbff456a0 0xbff4569c 0xbff4569c 0xbff45698