2016年06月08日学习日记c语言指针
int num=10;//普通变量
int *p=#//一指针(值:变量的地址)
int **q=&p;//二维指针(值:一定是一维指针的地址)
int ***s=&q;//三维指针(值:一定是二维指针的地址)
printf(“num=%d\n”,num);
printf(“p=%d\n”,*p);
printf(“q=%d\n”,**q);
printf(“s=%d\n”,***s);
数组
数组明就是一个指向数组首元素的‘指针’
指针就是数组 数组就是指针
数组名是一个指针常量,指针值不能发生改变
array=&array[1]//error 指针的值不能改变
使用数组名做+几(指针向后移动)-几(指针向前移动)操作
例1:
#include "stdio.h"
int main()
{
int a[]={0,2,4,6,8};
int *p[5]={a,a+1,a+2,a+3,a+4};
int **pp=p;
printf("%d\n",**pp++);
printf("%ld\n",*pp-a);
printf("%d\n",**++pp);
printf("%ld\n",pp-p);
return 0;
}//地址减地址 %ld
运行结果:0 1 4 2
例2:
#include "stdio.h"
int main()
{
char a='1';//97
char b='c';
char c='f';//102
char *p1=&a;
char *p2=&b;
char *p3=&c;
char *arr[3]={p1,p2,p3};
**(arr+1)='5';
printf("p3=%c\n",*p2);
printf("%d\n",*arr[2]-*arr[0]);//102-37=53 字符先隐式转换为整型(ascii码)再进行运算
return 0;
}
运行结果:
p3=5
53
指针运算
int array[3]
int num=(&array[2])-(&array[0]);//结果是偏移量 不是8(大小) 只能相减 不能相加相乘等等
printf(“%d”,num);//正确结果为2
指针数组:数组中所有元素都是指针
int num1=1;
int num2=2;
int array[5]={&num1,&num2};指针数组(数组中存储的都是指针比如这里的int *)
数组指针:指针指向一个数组 int (*p)[10]
#include "stdio.h"
void func1(int *x)
{
int z=10;
x=&z;//改变指针指向
printf("x=%p=%d\n",x,z);//0fkaf00
}
void func2(int *x1,int num)
{
x1=#//num和主函数number不是同一块地址
printf("x1=%p=%d\n",x1,num);//0x7fff5fbff7e4
}
void func3(int **x)
{
**x =1;
}
int main()
{
int number=100;
int *p=&number;
int **pp=&p;
printf("func1:%p=%d\n",p,number);
func1(p);
printf("func2:%p=%d\n",p,number);
func2(p, number);
printf("func3:%p=%d\n",p,number);
printf("number=%d\n",number);
func3(pp);
printf("func3:number=%d\n",number);
return 0;
}