指针也就是内存地址,指针变量是用来存放内存地址的变量; |
---|
type *var_name;
int *ip; /*一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
&内存,(&是取地址运算符);打印指针值/地址值: %p,显示方式为一个十六进制整数。不能打印出指针的偏移量。
p指向地址,*p取地址值
#include
int main()
{
int a=996;
//*P 表示 p指向a在内存所在地址值
int *p
//p-->&a p指向a在内存所在地址, &a指向a, 变量p保存了a的地址
p=&a;
printf("%p\n",&a);//0x3ffe76343a00这个值是随机的
printf("%d\n",*p);//996
return 0;
}
在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。
大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是操作系统保留的。然而,内存地址 0 有特别重要的意义,它表明该指针不指向一个可访问的内存位置。但按照惯例,如果指针包含空值(零值),则假定它不指向任何东西。
#include
int main()
{
int *p=NULL;
printf("%P\n",p);// 0x0
return 0;
}
用于存储地址的变量,即用于存储指针的变量。指针变量占用1个字长的存储空间。 |
---|
语法: 类型 *变量名
int *p1
char *p2;
short *p3;
long *p4;
int (*p5)[4];
int *p6[4];
void(*p7)(int,int)
指针偏移 就是指针的加减运算,实现指针指向地址的偏移。 |
---|
数据类型 | 内存空间(字节) | 指针加1的地址偏移量 |
---|---|---|
char | 1 | 1 |
short | 2 | 2 |
int | 4 | 4 |
float | 4 | 4 |
double | 8 | 8 |
含义:
int a = 15;
int * b = &a; //一级指针,定义一个指针变量b,将整型变量a的地址(指针)赋值给b
//b-->a 的地址,*b取到地址a的值
printf("%d\n",*p);//15
含义:一级指针的指针
int a = 15;
int * b = &a; //一级指针b--->a的地址
int **c = &b; //二级指针,指针c指向的是指针b,也就是说二级指针c存储的是一级指针b的地址
含义:多级就是n 级指针就是 指向 n-1 级指针的指针
int a = 15;
int * b = &a; //一级指针b--->a的地址
int **c = &b; //二级指针,指针c指向的是指针b,也就是说二级指针c存储的是一级指针b的地址。
int ***d = &c; //三级指针,指针d指向的是指针c的地址
三级指针前面加一个取地址运算符,也就是&d,则取出的是其自身的存储地址。 |
---|
而d则是取到指针c的地址,而d则是取到指针b的地址,而******d则是取到a地址上的数据。 |
想要获取指针指向的数据时,一级指针加一个,二级指针加两个,三级指针加三个*** |
sizeof(a)、&a时,才能把a当数组,其它情况都把a当作指针。
int (*p2)[3];
小括号让 p2 与 * 结合,表示 p2 是一个指针,这个指针指向了一个数组,数组中有 3 个元素,每一个元素的类型是 int 型。
int *p1[3];
中括号[]的优先级高,因此与 p1 先结合,表示一个数组,这个数组中有 3 个元素,这 3 个元素都是指针,它们指向的是 int 型数据。
#include
void arr(){
int arr[3]={1,2,3};//数组名arr只有在sizeof(arr)与&a的时候才被当作数组,其他时候为指针。
int *p=&arr;//p-->a的地址
//打印数组
for(int i=0;i<3;i++){
printf("%d",*(p+i));
}
printf("\n");//123
}
int main(){
arr();
return 0;
}
1.含义:
二维与二级以上的数组,叫多维数组. |
---|
在本质上,是一个一维数组的列表。声明一个 x 行 y 列的二维整型数组 |
二维数组与一维数组一样,分配的内存也是相同类型元素的连续内存. |
跟一维数组不一样,创建二维数组时,如果没有初始化,则元素的值是不可确定的.(static修饰时,有确认的默认值0) |
![]() |
二维数组指针偏移量
偏移量: &a->a, 整个数组长度。a->a[0], a[0]有多长,a的偏移量就有多长。
include <stdio.h>
//二维数组与指针
int main(int argc, char *argv[])
{
int arr[2][3]={1,2,3,4,5,6};
int *p=&arr;
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
printf("arr[%d][%d]%d\n",i,j,arr[i][j]);
//printf("%d\n",p+1);
}
}
//p->a[0][0]=1
printf("%d\n",*p);
//p->a p+1->a[0+1]
printf("%d\n",p+1);
//*p+1->a[0][1];//2
printf("%d\n",*(p+1));
//p->a p[0]==a[0][0]
printf("%d\n",p[0]);
//p-a p[4]==a[1][0]
printf("%d\n",p[3]);
return 0;
}