嵌入式学习--C语言Day06
指针
地址
*一级指针
**二级指针
一级指针存放普通变量的地址
二级指针存放一级指针的地址
格式
存储类型 数据类型 *指针变量名
int *p
*只有在定义指针的时候,表示定义指针,其他情况下*表示取内容
int a = 6;
int *p = &a;
printf("%p %p\n",&a,p);
//0x7ffc506660dc 0x7ffc506660dc
一级指针变量名存储普通变量地址
操作符
int a = 6;
int *p = &a;
*&a == a
& 取地址符 取变量的地址
* 取内容符 取地址里边的内容
a的地址
&a p
a的值
a *p
p == &a p &a
*p == *&a ==a *p a
初始化
存放普通变量地址
定义指针时,一定要进行初始化,否则就会产生野指针
int *p;//野指针
int *p = NULL; //指针初始化,赋值为NULL,后面可以重新赋值
int b = 0;
p = &b;
可以通过指针间接修改普通变量的值
*p+=2;
存放数组首地址
int arr[6] = {3,4,5,6,7,3};
int *q = arr;
printf("%p %p\n",q,arr);
printf("%d %d\n",*q,*arr);
//0x7ffcc400d620 0x7ffcc400d620
//3 3
char s[66] = "hello";
char *qw = s;
printf("%s %s\n",s,qw);
printf("%p %p\n",s,qw);
printf("%c\n",*qw);
//hello hello
//0x7ffdb27eadd0 0x7ffdb27eadd0
//h
存放另一个指针变量的地址
int a = 6;
int *p = &a;
int *q = p; // *q = &a
修改其中任意一个,其他几个的值会同步修改
运算符
算术运算
p++向高地址方向移动一个数据单位(int:4,char:1),指针的指向发生变化
p+n:暂时访问,向高地址方向移动n个数据单位,指针的指向不发生改变
char c[5] = "hello";
char *p = c;
printf("%c %p\n",*p,p);//h 0x7ffc41551ca3
p++;
printf("%c %p\n",*p,p);//e 0x7ffc41551ca4
int n[6] = {2,3,5,6,8,9};
int *o = n;
printf("%d %p\n",*o,o);//2 0x7ffc41551c80
o++;
printf("%d %p\n",*o,o);//3 0x7ffc41551c84
同一个数组中,两个地址的差值==相差元素个数
int n[6] = {2,3,5,6,8,9};
int *w = n;
int *r = &n[2];
printf("%d\n",r-w);//2
关系运算
> < ==
比较的地址的高低
同一个数组中比较有意义
指针大小
64位:指针大小8字节
32位:指针大小4字节
int a = 1;
int *p = &a;
printf("%ld\n",sizeof(p));//8
char b = 'c';
char *c = &b;
printf("%ld\n",sizeof(c));//8
float v = 4.5;
float *f = &v;
printf("%ld\n",sizeof(f));//8
段错误
Segmentation fault (core dumped)
指针虽然灵活好用但是用不好会出现段错误。出现的原因有:访问不存在的内存地址、访问系统保护的内存地址 、访问只读的内存地址、空指针废弃 (eg:malloc与free释放后,继续使用) 、堆栈溢出、内存越界 (数组越界)
https://www.cnblogs.com/linuxws/p/17227268.html
练习
将字符串转化为整形
#include <stdio.h>
int main(int argc, char const *argv[])
{
char a[7] = "123";
char *p = a;
int s = 0;
for (; *p >= '0' && *p <= '9'; p++)
s = 10 * s + *p - '0';
printf("%d\n", s);
return 0;
}