内存地址:内存中每个字节单位都有一个编号(一般用十六进制表示)
存储类型 数据类型 *指针变量名;int *p; //定义了一个指针变量p,指向的数据是int类型的。
访问指针所指向空间的内容用取内容运算符*
&:取地址符:取变量的地址
*:取内容符:取地址里面存放的内容
*&a=a;//*和&是互逆运算
&*a//错误(因为运算符优先级)
普通变量赋值
#include <stdlib.h>
int main()
{int a = 5;int *p = &a;char c='v';char *q=&c;printf("%p %p\n", p, &a);//p为a的地址printf("%p %p\n",q,&c);//q为c的地址printf("%d %d\n",a,*p);//*p是取地址中的值printf("%c %c\n",c,*q);//*q取地址中的值printf("Hello, World");return(0);
}
注意:指针变量使用前不仅要定义,还要初始化。未初始化的指针变量不能随便使用,不然可能会产生野指针。
通过改变指针指向,改变值
int a=10;int *p=&a;int *q=p;printf("%d %d %d\n",a,*p,*q);//10 10 10*q=20;//通过指针改变变量a的值printf("%d %d %d\n",a,*p,*q);//20 20 20
数组
1.数组的首地址赋值给指针变量
char s[10]="hello";
char *p = s;
int arr[5]={1,2,3,4,5};
int *q=arr;
printf("%c\n",*p);//h
printf("%d\n",*q);//1
2.指针加减操作其实就是让指针向前向后移动
(1)char 移动1
char str[32]="hello";char *p=str;printf("%c\n",*p);//hp++;printf("%c\n",*p);//ep--;printf("%c\n",*p);//h
(2)int 移动4
double 移动 8
偏移了多少字节=n*sizeof(数据类型)
char str[32]="hello";int *p=str;printf("%c\n",*p);//hp++;printf("%c\n",*p);//op--;printf("%c\n",*p);//h
运算方法
(1)++和*都是单目运算符
(2)单目运算符从右向左运算
(3)++在前是先移动再取值,++在后是先取值再移动。
int x[] = {10, 20, 30};
int *px = x;
printf("%d,", ++*px);//11
printf("%d\n%d", *px,x[0]);//11
这个++*px
把数组里的值给改了
int x[] = {10, 20, 30};
int *px = x;
printf("%d,", ++*px);//11
printf("%d\n", *px); //11
px = x;
printf("%d,", (*px)++);//11 先取值再+1,所以直接打印x[0]的值,然后再x[0]=11+1=12
printf("%d\n", *px);//12
px = x+1;
printf("%d,", *px++);//20 先取值再移位
printf("%d\n", *px);//30
px = x+1;
printf("%d,", *++px);//30 先移位再取值
printf("%d\n", *px);//30
二维数组
int a[2][3]={1,2,3,4,5,6};
a是数组名,表示第一行的首地址。
a+1表示第二行的首地址,以此类推。
在a前面加*,表示将行地址降级称为列地址。
*a;//第一行第一列的地址
*a+1;//第一行第二列的地址
*(a+1);//第二行第一列的地址
*(a+1)+1;//第二行第二列的地址
原文链接:https://blog.csdn.net/weixin_43624626/article/details/130715839
二级指针
存放指针的地址
int a = 10;int *p = &a;int **q = &p;
数组指针
本质还是指针,指向的是数组(又称为行指针)
存储类型 数据类型(* 指针变量名)[列数];
例如:
int a[2][3]={1,2,3,4,5,6};
int (*p)[3]=a;
p可以代替进行元素访问,但本质不同,p是指针变量,a是地址常量。
把p进行运算的时候,例题中情况要3个单位3个单位进行运算。
ASCII
A-65
a-97
相差32