1.指针和指针变量的关系
指针 就是内存的地址编号。
指针变量:本质是变量 只是该变量 保存的是 内存的地址编号。(不是普通的数值)
2.指针变量的定义
1、定义步骤(定义的时候)
int *p;
*修饰指针变量p。 保存谁的地址 你先定义谁。 从上往下整体替换。
案例1:
1 定义一个指针变量p 保存 int num的地址; int *p;
2 定义一个指针变量p 保存数组int arr[5]首地址; int (*p)[5]
3 定义一个指针变量p 保存函数的入口地址 int fun(int,int); int (*p)(int,int);
4 定义一个指针变量p 保存结构体变量的地址 struct stu lucy; struct stu *p;
5 定义一个指针变量p 保存指针变量int *p的地址 int **p
3.指针变量的详解
1、在32位平台任何类型的指针都是4字节
2、在64位平台任何类型的指针变量 都是8字
#include int main()
{printf("%ld\n",sizeof(char *));printf("%ld\n",sizeof(short *));printf("%ld\n",sizeof(int *));printf("%ld\n",sizeof(float *));printf("%ld\n",sizeof(double *));return 0;
}
4.指针变量和普通变量建立关系
#include int main()
{int num = 10;//建立关系int *p = #//%p 打印地址编号printf(" p = %p\n",p);printf(" num = %p\n",&num);printf(" p = %d\n",*p);printf(" p = %d\n",num);return 0;
}
注意:
5.指针变量的初始化
指针变量 在操作之前 必须指向合法的地址空间。
1、指针变量 如果不初始化 立即操作 会出现段错误。
2、指针变量 如果没有指向合法的空间 建议初始化为NULL
3、将指针变量 初始化为 合法的地址(变量的地址、动态申请的地址、 函数入口地地址)
int *p = NULL;//NULL是赋值给p int *p; p = NULL;1 int num = 10;
2 int *p = &num
6.指针变量指向的类型(重要)
int *p; p指向的类型为int
指针变量的指向类型 决定了取值宽度
int num = 0x01020304;
int *p = #
为什么 *p == num == 0x01020304?
#include void test()
{int num = 0x12345678;int *p1 = #printf("%#x\n",*p1);short *p2 = (short *)#printf("%#x\n",*p2);char *p3 = (char *)#printf("%#x\n",*p3);} int main()
{test();return 0;
}
7.指针变量的指向类型 决定了+1跨度 (重要)
void test01()
{int *p1 = NULL;printf("p1 = %u\n",p1);printf("p1 = %u\n",p1+1);short *p2 = NULL;printf("p2 = %u\n",p2);printf("p2 = %u\n",p2+1);char *p3 = NULL;printf("p3 = %u\n",p3);printf("p3 = %u\n",p3+1);}int main()
{test01();return 0;
}
void test02()
{int num = 0x01020304;short *p1 = (short *)#printf("%#x\n",*(p1+1));char *p2 = (char *)#printf("%#x\n",*(p2+1)); }int main()
{test02();return 0;
}
8.字符串与指针
1、字符数组
1 char str1[128]="hello world";
str1是数组 开辟128字节 存放字符串"hello world
1 sizeof(str1) == 128字节
2、字符串指针变量
char *str2="hello world";
str2是指针变量 在栈区/全局区 保存的是字符串常量"hello world"的首元素地址,而”hello world“在文字常量区
void test03()
{char *str = "hello world";printf("%s\n",str); //读printf("%c\n",str[6]); //读str[6] = 'w'; //不允许给 文字常量区赋值
}int main()
{test03();return 0;
}
9.指针数组
1.指针数组:本质是数组 只是数组的每个元素为 指针。32位平台:
1 char *arr1[4];
2 short *arr2[4];
3 int *arr3[4];
4 sizeof(arr1) ==16B
5 sizeof(arr2) ==16B
6 sizeof(arr3) ==16B
void test04()
{int num1 = 10;int num2 = 20;int num3 = 30;int num4 = 40;int *arr[4] = {&num1,&num2,&num3,&num4};int n = sizeof(arr)/sizeof(arr[0]);int i = 0;for(i=0;i<4;i++){printf("%d ",*arr[i]);printf("\n");} }int main()
{test04();return 0;
}
下一篇:vuex学习笔记(一)