指针定义
指针的本质也是一个变量。
指针存放的是变量的地址。
int a = 10;//定义一个a变量
int *p = &a;//定义一个指针变量p,存放的是a变量的地址
指针变量是8个字节的整数
*(解引用运算符)
char ch = 'W';
char s;
char *p = &ch;
s = p;//p在等号右边,把p指向变量ch的值取出来
p = 'M';//p在等号右边,往p指向的变量内存中写入内容
&(取地址运算符)
指针初始化
如果一个指针没有初值化,这样的指针是野指针,里面存放的是垃圾地址
初始化直接把一个变量的地址赋给一个指针,不确定时就初始化一个空指针
int a = 23;
int p = &a;//直接给指针变量赋个变量的地址
int *q = NULL;//给指针变量赋个空地址0x0;
注意:不要解引用一个空指针,会发生段错误!因为0号地址属于系统级的内存,不允许用户级程序访问。
指针与函数
1.指针作为函数的参数
形参是实参的拷贝,更改形参的值不会改变实参的值;传指针调用不是改变实参的值,而是通过形参改变实参指向变量的值。
2.函数返回一个指针变量
#include <stdio.h>
int *simaller(int *p, int *q)
{
return (*p > *q ? q : p);//返回的是一个指针(地址编号)
}
int main(int argc, const char * argv[])
{
int a = 15, b = 20;
int *p;
//调用函数返回最小值的地址
p = simaller(&a, &b);//用指针变量p接收
printf("%d\n", *p);
return 0;
}
输出结果为:15
3.函数指针
#include <stdio.h>
double (*fpfunc)(double a, double b);
double add(double a, double b);
double sub(double a, double b);
int main( )
{
fpfunc = add;
printf("%d\n", fpfunc(3.6, 4.8));//等价于add(3.6, 4.8)
fpfunc = sub;
printf("%d\n", fpfunc(8.5, 3.7));//等价于sub(8.5, 3.7)
return 0 ;
}
double add(double a, double b)
{
return a + b;
}
double sub(double a, double b);
{
return a - b;
}
指针与数组
数组名字,就是数组的首元素的地址(数组首地址)
数组名是一个指针常量,存放的地址不能更改
double b[5];
double *p = b;
printf("%p %p %p\n", b, p + 0, &b[0]);//三个结果相同,都是a[0]的地址
printf("%ld %ld\n", sizeof(b), sizeof(p + 2));
可以通过下标和指针两种方式遍历数组元素
指针数组(数组中的元素是地址编号)
指针数组的定义:
类型名 *数组名[数组长度]
char str[10] = "HelloBJ";
char *ps = str + 3;//str + 3是str[3]的地址
printf("%c ", *str);//等价于str[0]
printf("%c ", *ps);
printf("%ld\n", ps - str);//ps - str 表示ps 和 str 之间相隔了多少个类型长度
输出结果为:H l 3
指针常量和常量指针