下面通过一张图可以更直观的理解内存中的地址
内存中的地址演示图
*
指针变量的名称 --- int * p1;
指针变量的名字叫做p1,这个指针变量的类型是int*
读作int指针。
*
表示这个变量不是一个普通变量,而是一个专门用来存储地址的指针变量,所以有哪些普通的数据类型,就可以有哪些类型的指针。
声明的时候注意,*
的位置 建议 int* p
这样提醒我们这是一个int*
类型的指针。
** 一个指针变量并不是可以存储任意类型的变量的地址,而是有限定的,只能存储和这个指针类型相同的普通变量的地址。** 所以p
指针变量中只能存储int
类型变量的地址。 int num = 10;
int *p = # 建议int* p = #这样写
p指针指向了num变量。因为p指针的值就是num变量的地址,不能直接赋值一个非地址类型的常量数据,也不能直接赋值一个变量给指针。
*p
代表 p
指针指向的变量。
*p
完全等价于num
即 *p = 100
完全等价于 num = 100
。
*p = 100;
表示将100赋值给p指针指向的变量,也就是num变量使用指针变量的时候注意点
int* p1 ,p2, p3 ;
此时p1
是int *
指针,而p2,p3
是int
类型数据 如果希望全部都是指针需要 int *p1, * p2, * p3;
*
会使指针间接的操作指针指向的变量。// 从下面代码中就可以看出,我们可以直接在函数中修改两个变量的值。相当于函数有两个返回值。
void changeValue (int* p1 ,int* p2){
*p1 = 100;
*p2 = 200;
}
int main(int argc, const char * argv[]) {
int num1 = 1;
int num2 = 2;
changeValue(&num1, &num2);
printf("num1 = %d\n",num1);
printf("num2 = %d",num2);
return 0;
}
指针为什么要分类型?
数据类型 ** 指针名
二级指针只能存储一级指针变量的地址。
多级指针在开发中很少用到,遇到多级指针耐心分析一定可以理清其中的关系。int *
则+1代表加4个字节地址,以此类推。p[n];
前提p
是一个指针变量,完全等价于*(p + n);
所以arr[0]
就等价于 * [arr + 0]
。
操作数组我们虽然使用中括弧下标来操作,实际上内部本质仍然是使用的指针来操作。元素类型 数组名[数组长度];
int * arr[3];
arr数组里面存储int指针数据,最多存储3个。<, <=, >, >=, ==, !=
都可以使用
可以用来判断两个指针指向的变量的字节,谁在高字节,谁在低字节。或者两个指针的地址是不是同一个地址。char *name = "jack";
表示直接将一个字符串数据初始化给一个字符指针。
字符指针存储和字符数组存储的区别
// 字符数组存储:将字符串数据的每一个字符存储到字符数组的元素中,并追加一个 \n 表示结束
char name[5] = "jack";
// 直接为字符指针初始化一个字符串数据
char *name = "jack";
1.) 当他们都是局部变量的时候
字符数组是申请在栈区的,字符串的每一个字符存储在字符数组的每一个元素中。 指针变量是声明在栈区的。但是此时字符串数据是以字符数组的形式存储在常量区的。此时指针变量中存储的是字符串在常量区的地址
2.) 当他们作为全局变量的时候
字符数组是存储在常量区的,字符串的每一个字符存储在这个数组中的每一个元素中。 字符指针也是存储在常量区,字符串也是以字符数组的形式存储在常量区,指针中存储的是字符串在常量区的地址。
**以字符数组存储的字符串数据,可以修改字符数组的元素。可变
以字符指针的形式存储字符串数据,这个时候字符指针指向的字符串数据是无法修改的,不可变**
char *name = "jack";
nsme = "rose";
// 这样可以 但是并不是把jack改成了rose,而是重新创建了一个"rose",把rose地址赋值给name
char *names[4] = {"aa","bb","cc","dd"};
names数组的元素的类型是char指针,初始化给元素的字符串数据是存储在常量区的。元素中存储的是字符串在常量区的地址
因此这是一个存储指针的数组,每一个元素的类型是一个指针,占用得内存为8个字节。返回值类型 (*指针名)([参数列表]);
void (*pFunction)();
// 表示声明了1个指向函数的指针,名字叫做pFunction。
// 这个指针只能指向没有返回值,并且没有参数的函数。
int (*pFun)(int num1,int num2);
// 表示声明了1个指向函数的指针,名字叫做pFun.
// 这个指针只能指向返回值为int类型 并且有两个整型的参数的函数.
int MaxValue (int a, int b){
return a > b ? a : b;
}
int main(int argc, const char * argv[]) {
int(*pMaxValue)(int a, int b) = MaxValue; // 创建一个返回int 并且有两个int型参数的函数指针,并赋值。
printf("%d\n", pMaxValue(5,10)); // 通过指针调用函数方法1
printf("%d\n",(*pMaxValue)(6,9)); // 通过指针调用函数方法2
printf("%d\n",MaxValue(9, 13)); // 调用函数
printf("%p\n",MaxValue); // 输出函数的地址
return 0;
}
文中如果有不对的地方欢迎指出。我是xx_cc,一只长大很久但还没有二够的家伙。