C语言基础知识
1.指针
指针:指针是一个特殊的变量,它里面存放的是一个地址。
指针4要素:
1.指针的类型
//只要把指针声明语句里的指针名字去掉,剩下的就是该指针的类型
int *p; //指针的类型是int*
char *p; //指针的类型是char*
int **p; //指针的类型是int**
int (*p)[3] //指针的类型是int(*)[3]
int *(*p)[4]; //指针的类型是int*(*)[4]
2.指针所指向的类型
int *p; //指针所指向的类型是int
char *p; //指针所指向的类型是char
int **p; //指针所指向的类型是int
int (*p)[3] //指针所指向的类型是int()[3]
int *(*p)[4]; //指针所指向的类型是int*()[4]
3.指针的值(指针所指向的内存区或地址)
4.指针本身所占据的内存区(指针本身所占的内存大小)
- 所谓指针,就是内存的地址,所谓指针变量,也就是保存了内存地址的变量。指针的大小在32位平台是4个字节,在64位平台是8个字节
对于32位系统,程序能够使用的最大内存是4G,
最小的地址是0x0000 0000
最大得地址是0xFFFF FFFF
在指针定义中*是与变量名结合的
int main()
{
int *p,s; //p是整型指针变量,s是整型变量
char *cpa, *cpb; //cpa和cpb都是char类型指针变量
int a = 10;
int *ip; //未初始化的指针,野指针
ip = &a; //与int *p = &a 等价
return 0;
}
- 使用指针变量首先要明确指针变量自身的值(存储的是地址),在明确指针变量所指向的实体(解引用)
//传地址,x,y交换可以使主函数中的a,b的值发生交换
void Swap(int *x,int *y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap(&a,&b);
printf("a=%d b=%d\n",a,b);
return 0;
}
- 定义指针变量时,类型对指针变量起两个作用
(1)解析存储单元的大小
(2)指针变量加1的能力(指针P+1=指针P + sizeof(指针的类型* 1)
指针和整型加减后的结果仍然是指针类型
//赋值(=)优先级>*和++,*和++是自右向左结合
int main()
{
int ar[5] = {12,23,34,45,56};
int *p = ar;//等价于int*p = &ar[0]指针变量p指向数组首元素地址
int x = 0;
int y = 0;
x = *p++;//先执行x = *p;x的值就是12 再执行*p++;
//指向数组第二个元素23的地址
y = *p;//数组第二个元素的地址解引用,y的值就是23
printf("%d %dn\n",x,y);//12,23
x = ++*p;//先*p;解引用就是23,然后++23,赋给x,所以x的值是24
//这时候数组的第二个元素就变成了24
y = *p;//对数组第二个元素解引用,y的值就是24
printf("%d %dn\n",x,y);//24,24
x = *++p;//先执行++p;指针p指向数组第三个元素34的地址
//然后*p,解引用,x的值就是34
y = *p//34
printf("%d %dn\n",x,y);/34,34
return 0;
}
- 指针的应用:我们可以用一个指针和一个循环来遍历一个数组
int main()
{
const int n = 10;
int array[n] = { 0 };
int* ptr = array;
for (int i = 0; i < n; i++)
{
printf("0x%p => %d\n",ptr, *ptr);//遍历地址和地址里面存的值
(*ptr)++;
ptr++;
}
printf("\n");
return 0;
}
- 关于*和&
int a = 10;
int *p = &a;//p 等价于 &a,*p 等于 a本身
*&a => *(&a)//先取变量a的地址,等价于p,
//然后在取a地址上的数据,等价于*p,就是a本身
&*p => &(*p)//先取所指地址上的数据,等价于a,
//然后在取a的地址,等价于&a
*&p => //先取p本身的地址,再对p的地址解引用,等价于p本身