目录
一、指针和地址
1、地址
2、指针
二、指针的使用
1、定义
2、初始化
3、指针的引用
4、空指针
5、野指针
三、指针的大小
四、指针和数组
五、指针和函数
1、指针函数
2、函数指针
六、函数的参数传递
1、值传递:传递的参数为普通变量,改变形参的值,实参的值不会改变。
2、址传递:传递的参数为一个地址,子函数可以通过该地址访问到实参。
七、指针和字符串
八、多级指针
一、指针和地址
1、地址
现实生活中的地址:郑州市、二七区、民主路6号。人为规定的地址。
c语言中的地址:给一块物理内存或则虚拟内存进行地址的编号,以字节为单位,按顺序进行编号。
2、指针
一个存放地址的变量。通常称为指针变量。
二、指针的使用
1、定义
类型说明符 *指针名;
*说明这是一个指针变量。
类型说明符:指针指向内存单元存储的数据类型。
例:int *p;//定义一个指针变量,该指针能指向一个存储整形数据的内存单元。
char *p;//定义一个指针变量,可以指向一个存储字符类型数据的存储单元。
2、初始化
int num;
int *p = #//用一个地址来初始化指针。
3、指针的引用
int num = 10;
int *p;
p = #// & 取地址运算符
*p = 5; //num = 5; // * 指针运算符,用来访问指针指向的内存单元。
4、空指针
没有指向任何对象或则函数的指针(不能理解为未初始化的指针),通常理解为指向0内存单元。c语言中规定用宏定义NULL来表示空指针。
例:int *p = NULL;//int *p = 0;
5、野指针
指向未知内存单元的指针。例:未初始化的指针,看似没有指向,其实指向一个未知的内存单元,有可能存储的是系统代码,对其内容修改有可能使系统崩溃。所以要避免出现野指针。
三、指针的大小
32位的cpu有32位地址总线,对应指针的大小为4个字节。
注意:大小和指向的内容无关。
四、指针和数组
数组:内部的元素在内存中是连续排列的,数组名表示数组的首地址。
使指针指向数组的两种方式:
int num[5]={1,2,3,4,5};
int *p = num;//数组名表示数组的首地址
int *p = &num[0];//数组第一个元素的地址
指针指向数组的时候,指针++对应的是元素类型大小的变化。
指针数组:就是一个数组,里面的元素全部是指针。
一般批量处理字符串时使用。
char *p[3]={“fjaljf”,”gafaf”,”agggs”};
五、指针和函数
1、指针函数
就是一个函数,返回值为指针。
注意:返回的指针要有意义,即指针指向的内容不能被释放。
一般返回的是静态变量指针或则字符串指针。
#include <stdio.h>
char *fun();
int main()
{
char *p;
p = fun();
printf("%s\n",p);
return 0;
}
char *fun()
{
char str[] = "jfjlaj";
static char str1[] = "jglaj";
char *p = "jfjlaj";
//return str; //错误
//return str1;//正确
return p; //正确
}
2、函数指针
就是一个指针,指向一个函数。可以通过指针来访问该函数。
定义: 类型说明符 (*指针名)(参数类型);
例:int fun(int a); 函数指针为:int (*p)(int);//
#include <stdio.h>
int fun(int a);
int main()
{
int (*p)(int);
p = fun;
p(30);//fun(30);
return 0;
}
int fun(int a)
{
printf("%d\n",a);
return 0;
}
g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数
Int (*a)(int)
h)一个有 10 个指针的数组,该数组的每一个元素都是指针,并指向一个函数,该函数有一个整型参数并返回一个整型数Int (*a[10])(int)
六、函数的参数传递
c语言中参数的传递分为值传递和址传递。
1、值传递:传递的参数为普通变量,改变形参的值,实参的值不会改变。
#include <stdio.h>
int fun(int a);
int main()
{
int b = 12;
fun(b);
printf("%d\n",b); //b = 12;
return 0;
}
int fun(int a)
{
a = 10;
return 0;
}
2、址传递:传递的参数为一个地址,子函数可以通过该地址访问到实参。
#include <stdio.h>
int fun(int *p);
int main()
{
int b = 12;
fun(&b);
printf("%d\n",b);// b =10;
return 0;
}
int fun(int *p)
{
*p = 10;
return 0;
}
七、指针和字符串
c语言中允许用一个字符串来初始化一个指针。该指针指向字符串的首地址。
例:char *p = “jljhjljga”;
char str[] = “gjlag”;
p = str ;
注意:不能通过该指针改变字符串的值,因为字符串为常量,只读不可改变。但是指针的指向是可以改变的。
八、多级指针
指针的指针
定义: 类型说明符 **指针名;
int num = 5;
int *p = #
int **pp = &p;