嵌入式学习--C语言Day06

嵌入式学习--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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值