文章目录
跟据符号顺序依次判断类型
int p; //普通整型
int *p;//带*说明p是一个指针,int说明p是指向整型的指针
int p[3];//带[]说明p是一个数组,int说明数组里存放的是整型元素
int *p[3];//[]说明是数组,*说明数组里的元素是指针,int说明这些指针元素指向整型。所以p是一个储存了整型的指针所组成的数组。
int p(int);//p有()说明是个哈桑农户,函数有一个整型的参数,该函数返回的是整型
int (*p)(int);//*说明p是指针,()说明*p是指向函数的指针
指针的类型和指针指向的类型
int *p;
指针的类型是整型指针;
指针所指向的类型是整型;
int *pi;
*pi=5;
这样是错误的,因为整型指针只是声明但是没有实际的地址,赋值的话只有对象但是没有地址。
int a[3];
int *p,*q;
p=a;
q=&a[2];
这两种都是可以的,且(q-p)/sizeof(int)
const char *c = "hello";//常量代码区
char a[] = "hello";//数据区或者栈区
int *ptr;
ptr = (int*)0x8000;
这种随意直接分配地址的方式是十分危险的,因为可能并不知道这些地址指向什么地方
sizeof
char *a = "0123456789";
sizeof(a)
a是一个字符指针,指针的大小是定值,就是4字节
char a[] = "0123456789";
sizeof(a)
a是一个字符数组,数组最初未确定大小,填充后一个字符占一个字节,再加上隐含的\0,所以大小是11
char a[100]="0132465789"
sizeof(a)
a是一个字符数组,由于分配好了大小100,所以这个字符数组就是大小100
int a[100];
sizeof(a)
a是一个整型数组,一个整型的大小是4字节,所以最后整体的大小应该是400
char a[]="a\n"
sizeof(a)
由于\n算作是一个字节,所以最后加上\0大小是三
char var[10];
int test(char var[])
{
return sizeof(var);
}
本来var代表这个数组,其sizeof为10,但是由于作为函数参数传入之后,就退化为指针了,指针的大小都是4
指针的值
指针的值是一个地址,在32位程序中是一个32位的整数。指针指向的区域就是,从这个地址开始,然后长度位sizeof的区域,指针就是这个区域的首地址。32位是4个字节大小。指针大小与类型无关,始终是4个字节。变量的大小才会有区别。
指针算数运算
char a[20];
int *ptr = (int *)a;
ptr++;
a是一个字符数组变量,使用(int *)类型转换成了一个整型的指针,方便后面进行运算,因为整型的才能做算数运算;但这里即使不转也可以直接用。
ptr加1,在32位中实际是加4,所以ptr指向的地址由原来的a的低地址向高增加了四个字节,本来ptr是指向数组a的开始的四个字节,此时指向()
int array[20] = {
0};//注意初始化的格式,后面要么不加初值,要么也是{0}这样加大括号的形式
int *ptr = array;
for(i=0;i<20;i++)
{
(*ptr)++;
ptr