day9 指针

来源:互联网 发布:全美国际教育协会 知乎 编辑:程序博客网 时间:2024/05/15 03:32
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