这两天复习了一下C语言中的指针,发现很多东西几乎全忘了,然后在CodeBlocks中打印一些小程序,进行知识的恢复,以后再忘了,就到自己的博客中来查看下,顺便给一些刚学习C语言的同学一个参考,有不对的地方还请大家来指正,有疑问的请给阿涛留言。
一:五个重点概念
int *a;
int **a;
(1)指针的类型:指针本身自己的类型,如上两个指针,指针类型就是:int *, int **
判断方法:将定义的标识符拿掉,剩下的就是指针的类型
(2)指针指向的类型:指针指向的空间存储的数据的类型,如上两个指针,指针所指向的类型是:int int*
判断方法:将定义的标识符和左边的第一个*号拿掉,剩下的就是指针所指向的类型,这个类型决定了编译器对
这个指向的内存空间中的数据作为什么类型进行处理。
(3)指针所指向的内存空间:由于指针的值就是地址,这个值就是所指向的内存空间的首地址,那么这个地址空间
有多大呢?然后就需要看你所指向的是什么类型了。比如: int a; char b;
int *ptra=&a; char*ptrb=&b;
那么,ptra指向的空间大小就是一个int的大小,4个字节,ptrb指向的空间大小就是一个char类型的大小,一个
字节。
(4)指针的内存空间:指针也是一种数据类型,本身自然也有大小,但是不论什么样的指针,在32位下的系统中统
统都是4个字节。因为32位下的地址都是32位的。
(5)指针本身的地址:指针自己也有自己的地址,通过&取地址符也可以打印出来。
下面是我打印的一些小程序,大家可以copy下来挨个运行下,看看差异:
#include <stdio.h>
#include <stdlib.h>
int fun(int num);
int (*fun1)(int num);//指针函数
void swap(int *a,int *b);
int main()
{
/*指针遍历数组
int a[5]={1,2,3,4,5};
int *aptr=b;
for(i=0;i<5;i++)
{
printf("%d\n",(*aptr));
(*aptr)++;
aptr++;
}
for(i=0;i<5;i++)
{
aptr--;
printf("after:%d\n",(*aptr));
}*/
/*指针遍历char类型数组
char b[5]={'a','b','c','d','e'};
int *ptr=b;
ptr++;
printf("%c\n",(*ptr));
*/
/*32位下所有指针都是4个字节
char *a;
printf("%d",sizeof(a));
*/
/*将地址赋给指针,&是取地址符,&也可以将指针的地址取出来
int a=10;
int *ptr=&a;
printf("%d\n",&a);
printf("%d\n",&(*ptr));
printf("%d\n",ptr);
printf("%d\n",&ptr);
*/
/*双指针
int a=10;
int **ptr;
*ptr=&a;
**ptr=20;
printf("%d\n",**ptr);
*/
/*int 变量刚声明就赋给了空间,但是刚开始是个乱值。
int a=0;
printf("%d\n",sizeof(a));
printf("%d\n",&a);
*/
/*数组名可以当做指针
int a[5]={1,2,3,4,5};
printf("%d\n",*(a+2));
*/
/*指针和结构体.结构体内的变量不能赋值,结构体可以定义在任何地方,
但是后面必须有分号
struct str
{
int a;
int b;
int c;
};
struct str s;
s.a=100;
struct str*ptr=&s;
printf("%d\n",ptr->a);
*/
/*指针函数
fun1=fun;
int a=fun1(5);
// int a=(*fun1)(5);经过测试也可以
printf("%d\n",a);
*/
/*指针自己的地址是不会改变的
int a[3]={1,2,3};
int *ptr=a;
printf("%d\n",ptr);
printf("%d\n",&ptr);
ptr++;
printf("after:%d\n",ptr);//指针指向的地址,增加了4
printf("after:%d\n",&ptr);//指针的地址,没有改变
*/
/*指针转换
float a=13.8;
//int*pa=&a;不经转换,打印出来是错误的
//int *pa=(int*)&a;//经过转换也是不行的,指针是不能相互转换的
printf("%d\n",a);//应当是%f,不然还是乱的数据
*/
int a=100;
int b=200;
int *pa=&a;
int *pb=&b;
swap(pa,pb);
printf("%d %d\n",*pa,*pb);