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},不准使用第二个数组。
//练习:使用指针交换两个变量的值