C语言基础大头来了(指针)

C语言基础

指针初讲

  • 指针变量:就是一种用来存储地址的变量。
  • 表示方法:int *p;这里的 * 是用来代表p存储的是地址。int代表将来存储的是什么类型的变量的地址。
int *p=&a;

int *p;
p=&a;
int a;
int *p=&a;
*p=7;
printf("%d",a);//a=7;
**(*(&a)=7,*是指取p所指向的那个变量地址所对应的值。)**
int *q=&a;
*q=9;
printf("%d",a);//a=9;
  • 指针变量自身也有一个地址

  • 指向指针的指针

  • 数组与指针的关系

    • 数组的首地址就
    • 访问一维数组第i个元素的地址
    • 数组名就是首元素的地址
    a<===>&a[0]
    a+i<===>&a[i]
    int *p=&a[0]
    
    p=&a[0]=a
    p+i=&a[i]
    *(p+i)=a[i]=p[i]
    
    int arr[5]
    int *p=arr
    数组名就相当于首元素的地址
    1.第i个元素地址访问方法
    p+i<===>&p[i]<===>arr+i<===>&arr[i]
    2.第i个元素数值访问方法
    *(p+i)<===>p[i]<===>*(arr+i)<===>arr[i]
    
    • arr 实际上int const - *arr;表明arr永远指向第一个元素,不能更改,就是说arr++非法
    • p++合法
  • const变量:

    • 代表这个变量属性只读不可写(不可改变)。
    • const变量只能在定义的时候进行初始化
    两种定义方式:
    const int a;
    int const a;
    
    • const使用:
    int a=9;
    const int *p=&a;
    int const *p=&a;
    *p=3;//会报错
    
    • 如果const是写在*的左边,代表这个变量将来如果用p访问的时候,内容只读。
    int a=9;
    int b=2;
    int *const p=&a;
    p=&b;//会报错
    
    • 如果*写在const右边,代表这个指针变量的本身内容只读,不可更改
    const int *const p=&a;
    int a=9;
    int b=2;
    p=&b;*p=3;//都会报错
    
    • 如果*左右都有,代表const指向的内容只读,p本身的内容只读。
  • 指针数组

    • 先算[],说明他是个数组,再算*,代表这个数组所有的元素都是指针。
    int a,b,c;
    int *p[3]={&a,&b,&c};
    *(p[0])=7;
    printf("a=%d\n",a);//a=7;
    
  • 多个指针变量同时赋值

 int *p, *q;
  • 指针所占字节数
    • int *,char *,在32位机占4个字节,在64位机占8个字节。
    printf("int *占%ld个字节\n",sizeof(int *));
    printf("char *占%ld个字节\n",sizeof(char *));
    
  • 定义一个指针必须要给其初值
    int *p;
    *p=4;//会报错。
    
    int *p=NULL;
    *P=4;//就可以了。
    
  • 运算优先级
    • ()>单目>算数>关系>逻辑>三目>赋值>,
    • 单目>双目>三目
    int a=(3,5);
    printf("a=%d\n");//,是从左往右算,结果为5.
    

//练习:定义一个整型数组,使用指针去对数组进行排序

//练习:
int arr[5]={1,2,3,4,5};
请你将数组元素颠倒输出,变成{5,4,3,2,1},不准使用第二个数组。

//练习:使用指针交换两个变量的值

你可能感兴趣的:(C语言基础大头来了(指针))