指针
//1.指针:地址
//2.指针变量:存放地址的变量
//3.&取地址运算符 *取值运算符 %p地址站位符
//4.int *p=NULL; 这里的*号只是提醒这是一个指针
//5.p=&a; 取出a的值
//6.printf("%p",p); 打印这个地址
//7.printf("%d"*p); 打印地址中存的值
//8.int a=10; *&a;如果同时使用*和&作用会被抵消
//9.指针变量存的是内存的编号,这个编号占8个字节
//10.int *p=0x0; p=p+1 对指针变量进行整形数加减,int类型一次移动4个字节 ,char类型一次移动1个字节,double类型一次移动8个字节,移动位置和类型有关
//***************************************************************************************************************************
//指针和数组之间的关系
/*
1.一个数组的数组名其实就是地址,而且是首地址,而且是常量;
2.计算机内存划分为五个区域:①栈区 ②堆区 ③常量区 ④静态区 ⑤代码区;所有的变量都被存放在栈区(不包括全局变量) ,自己申请的内存是放在堆区中,所有程序中的常量都被放在了常量区(常量区的东西无法改变),全局变量放在静态区,用static标注的也放在静态区.
3.指针变量指向一个数组就是令指针变量等于数组名
int a[10]={0};
int *p=a;
4.最正常的形式:a[i];
文艺型的形式:p[i];
闷骚型的形式:*(p+i);
2B型的形式 :*(a+i);
5.指针变量的大小跟操作系统有关
6.指针变量取值的时候,注意和数据类型一致,否则容易出错
*****************************************************************************************************************************
//指针和字符串的关系
*/
// int a=0;
// scanf("%d",&a);
// int *p=NULL; //这就是一个指针 NULL是空的意思 告诉我们这个指针变量什么也没指
// int a=200;
// p=&a; //&取址符,取a的地址
// printf("%p\n",p); //系统分配的地址
// printf("%d",*p); //取出地址中a的值
/*
int *p=NULL;
int a[5]={1,2,3,4,5};
p=a;
printf("%d\n",p[0]); //可以打印出1
printf("%d",*(p+1)); //和数组配套使用 这种方法可以取出数组中相应的值,+1表示取第二个值
*/
//使用指针时 注意不要越界
//定义一个数组 使用指针输出数组中的值
/*
int m[10]={1,2,3,4,5,6,7,8,9,0};
int *p=NULL;
p=m;
for(int i=0;i<10;i++)
{
printf("%d ",*(p+i)); //p[i]也可以取出地址中的值,输出结果一样
}
*/
// int *p=NULL;
/*
int a[10]={0};
//int b[10]={0};
p=a;
// p=b;
// a=b; 数组名是地址常量,里面的值不可以被改变
printf("数组的大小:%lu\n",sizeof(a)); //如果sizeof一个数组返回的大小是整个数组的大小
printf("指针的大小:%lu\n",sizeof(p)); //sizeof一个指针变量,返回的是这个指针变量的大小
*/
//记住这几种方式 都可以直接取出数组中的某个指定的地址,即可输出其中的数
/*int a[5]={1,2,3,4,5};
p=a;
p=a+2;
p=&a[2];
p=p+2;
p=&p[2];
*/
//重指向
/* int a=0;
int b=10;
int *p=&a;
//printf("%d\n",*p);
p=&b;
printf("%d\n",*p);
*/
/*
short a[4]={3,7,9,1};
int *p1=a;
char *p2=a;
// printf ("p1=%d\n",*p1);
printf ("p2=%d",*(p2+4));
*/
//指针和字符串的关系
/*char a[]="你好我是字符串";
a[18]='o';
a[19]='\0';
printf("%s\n",a);
char *str="字符串我来了";
printf("%s",str);
*/
//通过指针可以计算字符串的长度。提示:遇到’\0’表⽰示字符串结束。
/* char str[]="iphone";
char *p=str;
int count =0;
while(*p!='\0')
{
count ++;
p++; //p是地址 一直往后加
}printf("%d个字符\n",count);
*/
//两个指针相减 计算的结果是两个指针相隔多少元素
/*
int a[10]={0};
int *r=a;
int *p=a;
p+=10; //指针指向第十个元素
long test =p-r;
printf("%lu",test);
*/
//指针数组
/*
char *str[]={"abc","def","ghi"};
printf("%s",str[0]);//这就是指针数组 []里面的数字可以指定输出哪个字符串
*/
/*
int a=10;
int *p=&a; //这样就存放了a的地址
*/
//指向指针的指针的定义
/*
int a=10;
int *p=&a;
int **r=&p;
int ***c=&r;
int ****d=&c;
printf("%d",****d); //输出d
*/
//注:永远不要使用没有赋过地址的指针,因为你不确定这里面存着什么.
//如 int *p; 这是没有指向的指针
//使用指针交换两个数
/*
int a=10;
int b=20;
int *pa=&a;
int *pb=&b;
printf("a=%d,b=%d\n",a,b); //交换前
change(pa,pb);
printf("a=%d,b=%d ",a,b); //交换后
*/
posted on 2015-07-24 11:56 yucaijiang 阅读(191) 评论(0) 编辑 收藏 举报