指针也可以叫做地址,实质就是一个数字,代表内存中某一个字节编号,只不过数字过于长,都已16进制显示
时刻记着, 指针 地址 单元标号,只能标注一个字节,也就是说指针只能指向一个字节的空间
指针也是分类型的
定义一个整形指针:数据类型 * 指针变量名 = 初始值
int a= 9;
指针
int* p = NULL;NULL代表空地址,相当于整型中的0在此之气唯一的修饰功能,修饰变量p是个指针变量
p = &a;
printf("%d \n",a);
printf("%p \n",p);//%p 用来输出地址变量
指针指向内存的首地址
// 变量的赋值
//1,直接赋值
a = 19;
//2.间接赋值,通过访问地址
// * 的第二个作用,取值符号,要和取地址符&区分清楚
p = &a;
*p = 30; // *P 等价于a
printf("%d \n ",a);
*(&a) == *p == 30;
例
有一个指针变量,初始值为20,定义指针,并且通过指针完 成此变量重新赋值(为52)并输出
int a = 20;
int* p = NULL;
p = &a;
*p = 52;
printf("%d ",a);
以下是常见的奔溃格式,向空地址中存值
int m = 0;
int* n= NULL;
//或者 int *n;
*n = 89;
printf("%p\n",n);
/*
区分空间
区分指针变量的空间和整形变量的空间:
1.指针变量的空间存储的永远只能是地址
2,整形变量的空间存储的是整形数值
*/
指针变量所占的内存跟指针类型无关,跟电脑位数有关,32位--指针变量占4个字节,64位系统--指针变量占8个字节
/*
short *q1 = NULL;
printf("%lu",sizeof(q1));
char *q2 = NULL;
printf("%lu",sizeof(q2));
float *q3 = NULL;
printf("%lu",sizeof(q3));
double *q4 = NULL;
printf("%lu",sizeof(q4));
long *q5 = NULL;
printf("%lu",sizeof(q5));
*/
指针只可以做加减运算
注意:内存使用口诀:内存空间从高位到低位来分配,从低位到高位来存取
指针的类型就决定了指针运算时移动的字节数,如果int型指针+1,则向高位移动四个字节,如果double型指针-�1,则向低位移动8个字节;
例
int n1 = 3, m1 = 10;
//以各种手法输出10
int *p = NULL;
p = &n1;
*p = 10;
printf("%d\n",n1);
printf("%d\n", *(p-1));
printf("%d\n", *(&n1-1));
printf("%d\n",m1);
printf("%d\n",*(&m1));
p = &m1;
printf("%d \n",*p);
//指针和数组
int array[] = {2,3,4,5,6};
//声明整形指针
int *point3 = NULL;
//有没有发现,无论指针所要指向的变量所占的字节有多大,指针也只能指向内存区域的首地址
point3 = &(array[0]);
point3 = array;//数组名就是本数组的首地址
point3[1] = 89;
array[0] = 78;
for (int i = 0; i < 4; i++) {
printf("%d ",point3[i]);
}
printf("%d",(point3 + 1));
printf("%d",(array + 1));
指针变量可以重指向,但是数组名只能代表本数组的首地址
网友评论