存放变量地址的变量
int a = 1;
int *p;
p = &a;
在64位系统中,占用8个字节
- 直接引用
- 间接引用
*p : 指针指向的变量的值
不要使用未初始化的指针
1.使用指针实现改变实参值
2.函数返回两个值, 使用指针参数可以改变值的方法
3.不同类型的指针的区别,区分指向的值的长度
A.指针与一维数组
1.利用指针读取数组元素
2.利用指针遍历数组元素
2.利用指针遍历数组元素
指针加减可以操作指针的指向地址
p++, p+1, p+2
根据指针类型,跳转规定长度的地址
ps:数组名即数组位地址,不允许使用++自加,因为它是常量,不允许赋值,但是可以进行加减供其他地方使用。
使用指针还是数组存储字符串
需要改变字符串:数组
不需要改变字符串:指针 char *p = “abc”
数组下标与指针加减
int a[5];
int *p = a; 或 int *p = &a[0];
a[2] ===> p+2;
3.指针数组
char *names[5] = {“jack”, “Lucy”, “Sam”, “Tom”, “Cc”};
B.指针与函数
1.指向函数的指针
函数名代表函数地址
定义一个指向函数的指针
sample1:
//Define a pointer pointting to a function
int (*p) (int, int);
p = sum;
//Call sum by p indirectly
p(,);
sample2:
void (*p)(); p = test; p();//or (*p)();
可以把函数当做参数传送
int test(int a, int b, (*p)(int int)
{
return p(a, b);
}
函数名代表函数的首地址,类似数组
2.返回指针的函数
char *test()
{
return “hello”;
}
C.指针与指针
指针类型的作用
例如指针加减p+1 p+2 p-1,自增自减p++, p—,需要根据指针类型确定内存偏移位置
int **p;//指向整型指针的指针
空指针 void *
p = NULL;
D.指针与字符串
char name[] = “Simon”; <==字符串变量,数据在栈中
输出效果等价于
char *name = “Simon”; <== 字符串常量,数据在常量区
例如
char *name1 = “Simon”;
char *name2 = “Simon”;
name1 和 name2 指向的实际是同一个常量
char *name1 = "Tom";
char *name2 = "Tom";
printf("name1 addr = %p, name2 addr = %p\n", name1, name2);
char *name2 = "Tom";
printf("name1 addr = %p, name2 addr = %p\n", name1, name2);
out:
name1 addr = 0x104d05f6d, name2 addr = 0x104d05f6d
指针也能像数组一样访问其中的字符,例如name1[2];
区别:
使用sizeof的时候,对数组能够得到数组所占用的字节数,而指针得到的是指针占用的字节
字符串数组可以修改字符串,字符串指针不能,只能改变指向