day9 指针

来源:互联网 发布:全美国际教育协会 知乎 编辑:程序博客网 时间:2024/09/21 06:17
1.内存中的最小存储单元叫字节,为了方面我们操作内存中的数据,生产商对每一个内存中的存储单元进行编号,这个编号就叫做地址,地址其实就是指针,指针就是地址。
2.访问内存中的数据有两种:直接变量  间接变量
3.int a  = 10 ;printf("a = %d\n",a);通过变量名访问内存中的数据的方式就是直接访问
4.通过代码的方式查看a的内存分配地址
5.& 代表取地址符号  &a代表取到a的地址,并返回
6.%p是地址的占位符
7.指针的变量:指针变量就是存放地址的变量
8.如何定义一个指针的变量  类型修饰符   指针变量名  = 初始值
9.定义指针的 * 就是一个指针的标示符,告诉编译器这时个指针变量
10.int *p = NULL;//0x0
    printf("%p\n",p);
11.注意:指针变量所占的字节数只与操作系统有关
12.取出变量b的地址,赋值给指针变量p p =&b;
直接访问printf("%d\n",b);
间接访问  
*取值运算符  *p 取出指针p指向的那块内存中存储的数据
printf("%d\n",*p);
14.定义整形的指针变量
int *p = NULL;
int *P2 =NULL;
int a = 20,b = 30;
15.给指针变量赋值
p = &c; p2 = &d;printf("%d %d\n",*p,*p2);
//指针变量的重新赋值叫做指针大的重置向
16.练习 使用指针交换整形a,b变量里面的值
    int a = 10,b = 8;
    int *p1 = NULL;
    int *p2 = NULL;
    p1 =&a;
    p2 =&b;
    int temp = *p1;
    *p1 = *p2;//*p1=?
表示向指针p1指向的内存的存放入数据
    *p2 = temp;
    printf("a = %d b =%d \n",a,b);
17.***指针的常见的问题
内存编号比较小的内存单元是由系统操作的不允许访问
int *p =NULL;
 *p =10;这时错误的!!!!!
定义指针的时候一定要付初始值,如果不赋初始值,这个指针就是野指针,操作野指针是很 危险
int *p;
*p = 100;
定义指针式*到底怎么写
    int * p =NULL;//
指针类型(int *
    int* p1 =NULL;
    int*p2 =NULL;
    int *p3 =NULL;//
推荐写法,因为苹果公司就是这么写的
18.指针类型在内存中所占的空间的大小
19.指针变量在内存中所占的字节数之和操作系统有关,32为占4个字节,64位的占8个字节
20.printf("%lu\n",sizeof( int *));
    int *p = NULL;//
    printf("p = %lu\n",sizeof(p));
21.修饰指针类型的数据类型比如:int char float ,int 修饰的指针会从起始位置向下找4个字节空间的数据,float修饰会找4个字节空间,char修饰的时1个字节的空间
22 .int *p1 = NULL;
    int a = 258;
    p1 = &a;
   
    printf("%d\n",*p1);
    //
定义指针是指针类型修饰符一定要和他指向的那块空间的变量数据类型一样,只有这样才能完整的把那块空间里的数据取出来;
    //
什么类型的指针指向什么类型的变量
    char *p2 = &a;//
不合法的
    printf("%d\n",*p2);
23.指针的算数运算,只有加减运算,这时类型修饰符决定指针变量做加1操纵时,跳转多少个字节,int +1  跳转4个字节;char +1跳转1个字节;short + 1 跳转2个字节;long + 1跳转8个字节
24.相同点 :取到的都是下一个空间的首地址
25.不同点:p+1 没有造成指针的重置向,++p和p++造成了指针的重指向
26.指针与数组
int a[5] ={1,2,3,4,5};
    //
数组名a代表数组元素的首地址,而且是数组的第一个元素的地址
    printf("%p\n",a);
    printf("%p\n",&a[0]);//
第一个元素的地址
    printf("%p\n",a+1);
    printf("%p\n",&a[1]);//
第二个元素的地址
    printf("%p\n",a+2);
    printf("%p\n",&a[2]);//
第三个元素的地址
    printf("%p\n",a+3);
    printf("%p\n",&a[3]);//
第四个元素的地址
    printf("%p\n",a+4);
    printf("%p\n",&a[4]);//
第五个元素的地址
    *(a+1)
取出数组中下标为1的元素值
    printf("%d\n",*(a+1));//
数组的首地址向下跳转4个字节之后,指向的空间地址
    *a + 1
    printf("%d\n",*a+5);//先把a指向空间的值取出来,再加上5,结果是6
27.使用指针遍历数组
    for (int i =0; i <5; i++) {
        printf("%d\t",*(a+i));
    }
28.使用指针变量指向数组
int *p = NULL;
p =a;
 printf("\n%p\n",p);
    printf("%p\n",a);
    printf("%p\n",&a[0]);
    //
通过指针变量P来访问数组中的元素
    printf("%d\n",*p);
    printf("%d\n",*(p+1));
    for (int i = 0; i <5; i++) {
        printf("%d\t",*(p+i));
    }
    printf("\n%d\n",2[p]);//
指针可以当数组名使用,要求掌握,了接
    **** p[1] = 3;恒等于a[1],恒等于*(p+1),恒等于*(a+1)
  29.数组名和指向数组首地址的指针变量的区别:数组名是一个指针常量不能修改,但是指向数组首地址的指针变量是可以重指向的
30.数组名使用sizeof计算得到的结果是,整个数组在内存中所占字节数,而是用sizeof计算指向数组时候首地址的指针变量的结果是一个定值4或8
 printf("\n%lu\n",sizeof(a));//20
    printf("%lu\n",sizeof(p));//8
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 全民k歌不能用wf怎么办 雅乐之舞掉叶子怎么办 姬珊瑚发软歪了怎么办 胃胀气怎么办简单的方法 8个月的宝宝咳嗽怎么办 坐完月子掉头发怎么办 在香港买到假货怎么办 用气垫脸上浮粉怎么办 不够奶给宝宝吃怎么办 叶插发芽发根后怎么办 多肉植物摊大饼怎么办 英短蓝猫掉毛怎么办 英短蓝猫很凶怎么办 面部打伤怎么办了肿了 朋友欠钱一直拖怎么办 旧车三年不年检怎么办 遇到领导整你该怎么办 皮肤热了就瘙痒怎么办 猫爪子肉垫脏了怎么办 嘴周围干燥起皮怎么办 下嘴唇总是起皮怎么办 上嘴唇老是起皮怎么办 涂口红嘴唇起皮怎么办 上嘴唇干裂起皮怎么办 9岁儿童嘴唇干裂怎么办 上嘴唇干裂烂了怎么办 孕妇脚干的裂开怎么办 小腿皮肤干燥起皮怎么办 秋天脸干燥起皮怎么办 脚上干燥起皮怎么办 脚皮肤干燥起皮怎么办 脚有脚气脱皮又痒怎么办 脚特别干还脱皮怎么办 皮肤干燥起皮怎么办痒 脚一直脱皮怎么办不痒 我的脚老是起皮怎么办? 脚裂了怎么办 小妙招 牛不吃草不倒嚼怎么办 婴儿吸奶乳头痛怎么办 公犬的生殖肿了怎么办 大阴唇一边肿了怎么办