A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wzf2015 中级黑马   /  2015-11-13 23:19  /  1178 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


1.指针的含义:是数据类型且是存放地址的变量
定义格式: 数据类型 *指针名,int *p;
指针的获取:&变量名
int *p=&a;(p存储的是a的地址,*p是a的地址里面的值(*p==a),&p表示自身的地址)
2.指针的作用是:存储地址且可通过地址访问该地址空间的数据(可以修改数据)
3.运算时编译器会创建一个临时空间,结束时空间就释放了
4.语法就是编译器的规则
5,*跟类型数据名表示是定义了一个变量,指针本身有空间的
6,*修饰是什么,就表示是什么指针,判断原则:先确定数据类型(看优先级)
7.指针是什么类型的,就要存什么类型的地址,否则*p取对应内存空间的值会出错
8,指针没被赋值之前不要用*p,因为它分配的地址是随机的,既里面的值是随机的

                            指针与数组
指针数组:存储指针的数组int *p[5];
/*指针与数组的关系*/

#include <stdio.h>

int main(){
   
    /*指针的基本用法
     
    //定义:类型 *指针名;
    int *p;
    //赋值:p=&变量名;
    int a=0;
    p=&a;
    //操作.*指针变量名==变量名.操作指针所指向空间的数据.要么取出数据*p;
    *p=10;//修改里面的值.
     
    */
   
   
    /*
     一,什么是指针数组?
     表示一个数组,用来存指针的数组就叫指针数组.数组里面的元素都是指针.
     如:int *p[3];表示定义一个可以存三个int指针的数组.
     赋值: int a1=1,a2=2,a3=3;         int *p[3]={&a1,&a2,&a3};   
     取值: int *a=p[0];

     
    //定义一个指针数组
    int *p[3];
    int a1=1,a2=2,a3=3;
     
    //创建三个指针(int型)
    int *p1=&a1;
    int *p2=&a2;
    int *p3=&a3;
     
    //给数组赋值
    p[0]=p1;
    p[1]=p2;
    p[2]=p3;
     
    //取值
    int *ptemp=p[0];å
    printf("p1=%p,ptemp=%p\n",p1,ptemp);
     
    */
   
    /*
     
     二.什么是数组的指针?
     表示一个指针,而这个指针类型是数组.
     如:int (*p)[3];表示这是一个含有三个元素的int数组的指针.
     赋值:int arr[3]={1,2,3}; int (*p)[3]=&arr;
   
    //定义:固定写法.一定要加括号,不然变量p先与[]结合.成数组了.
    int (*p)[3];
     
    //赋值
    int arr[3]={2,3,4};
    p=&arr;
    //arr是表示一个数组,里面包含第一个元素的地址.arr=&arr[0]
    printf("数组的地址:&arr=%p,数组第一个元素的地址:&arr[0]=%p,arr=%p\n",&arr,&arr[0],arr);
    int *p1=arr;
     
    //取值操作
    printf("%d\n",(*p)[2]);//\*pd等效于arr;
    (*p)[2]=8;
    printf("%d\n",(*p)[2]);//arr[0]
     */
   
   
    /*
     
     三.什么是数组元素的指针?
     表示一个指针,而这个指针存的是数组一个元素的地址.
     如:int arr[1]={1}; int *p=&arr[0];

     */
    int arr[1]={1};
    //定义并赋值
    int *p=&arr[0];
    //操作数据
    printf("*p=%d,arr[0]=%d\n",*p,arr[0]);
   
    return 0;
   
}








地址一旦被取,就是一个指针了,如果没有命名就是匿名指针(&a就是一个指针)
数组指针:存储数组的指针int (*p)[3]
                 特点
指针只能加减运算,地址的移动(如果移动了一位,就是移动了该指针数据类型的字节数*(p+1)),
如果是数组,*(P+1)移动的是整个数组字节数的字节数
/*指针与数组的特点*/

#include <stdio.h>

int main(){
   
    /*
     
     2.指针可以运算.但仅限于加减运算.运算的实质就是地址运算.即地址的移动.

    int arr[3]={1,2,3};
    int *p=arr;//int *p=&arr[0]
    int a=*p;
    //a=*(p+1);//等效于:int *p1=&arr[1]; a=*p1;
     
    int *p1=&arr[1];
    a=*(p1+1);//p1的值并没有改变.
    printf("p1=%p\n",p1);
     
    p1=p1+1;//赋值之后才改变了
    printf("p1=%p\n",p1);
    a=*(p1-1);
   
    printf("%d\n",a);
     
     */
   
    /*
     
     3.地址(+1)向高位移动,而(-1)向低位移动.
     不同指针类型移动一位(+1或-1)的字节数不同.
     4.实际移动的字节数看指针类型,类型占多少个字节,一位就移动多少个字节.

   
   
    char arr[3]={'a','b','c'};
    char *c=&arr[1];//char *c=arr;
     
     //printf("c=%p\n",c);
     //printf("%c\n",*c);
     //c=c+1;
     //c=c-1;
     //printf("c=%p\n",c);
     //printf("%c\n",*c);
    //\*(c+1)等效于:c[1+1]
     
    //(*注意)仅当指针c为第一个元素指针时可以与arr互换.
     printf("%c\n",arr[3]);//数组越界会有警告
     printf("%c\n",c[2]);//指针只管移动,不管是否越界
     
    */
   
    /*指针的运算移动时,只在在内存区域内不受限制*/
   
    int b=2;
    int a=0;
    int *p=&a;
    printf("%d\n",*p);
    p=p+1;
    printf("%d\n",*p);
   
      
}




用指针取出来的值是该指针的数据类型,在CPU中是计算机机器语言
数组名表示第一个元素的地址,&数组名是整个数组的地址,两者的值是相同,但意义不同
把*p去掉,剩下的部分就是类型
指针也有指针名[移动数量],等效于*(P+移动数量)
指针不受限制,随便怎么移动

                                       指针与二维数组


                                          字符串与指针

内存泄露:创建的变量使用后,内存,没被释放
指针定义的字符串是常量,不能被改变,而字符数组定义,字符串数组利用的是用一个
指针型函数:函数的返回值是指针;int *add(int *P){}没有多级指针
函数指针:是指针,函数会在内存开辟一块空间,函数指针既这块空间的地址

char arr[2][3]={2,5,4,4,5,6}

4 个回复

倒序浏览
学习一下
回复 使用道具 举报
学习借鉴一下
回复 使用道具 举报

加油!!!!!!
回复 使用道具 举报
八错八错
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马