一、*p++和++*p用法
(1)y = *p++; 等于y = *p; p++;
例:int *p, a=3, y = 0;
p = &a;
printf(“%d,%x”, *p, p); 结果: 3, bf884ff8
y = *p++;
printf(“%d,%x”, y, p); 结果: 3, bf884ffc
printf(“%x”, *p); 结果: bf884ffc
(2)y = ++*p; 把*p的内容+1给y。
例:int *p, a= 3, y = 0;
p = &a;
printf("%d, %x\n", *p, p); 结果:3, bfdf7568
y = ++*p;
printf("%x, %x\n", y, p); 结果:4, bfdf7568
printf("%x\n", *p); 结果:4
总结:经过*p++后,指针p移向下一个位置,由于定义的是int型指针(int型占4个字节),所以移动的一个单元是4个字节,y的值始终是不变的,而*p在之前是3,之后输出的是移动后的指针p的地址,因为p指向的地方没有存有数据无法输出具体数值,所以输出的是地址。经过++*p后,只有*p(即p指向的地址存储的数值)发生改变(+1),p的地址没变。(指针变量+1,表示下一个单元;地址+1,表示下一个字节)
二、指针和数组
int a[5] ={1,2,3,4,5};
int *p;
p = a; ------将数组a的首地址给p,可换成p = &a[0],将第一个元素的地址给p。
printf("a[2] = %d\n", a[2]); 结果:3
printf("a[2] = %d\n", p[2]); 结果:3
printf("a[2] = %d\n", *(p+2)); 结果:3
printf("a[2] = %d\n", *(a+2)); 结果:3
printf("a[2] = %d\n", *(&a[0]+2)); 结果:3
三、指针和字符串
char *ptr;
ptr = “helloworld”;
等于:
char *ptr = “helloworld”;
例:
char *ptr;
ptr = “helloworld”;
printf(“%s\n”, ptr); 结果:hello world
printf(“%c\n”,*ptr); 结果:h
printf(“%s\n”,*ptr); 出现段错误
总结:ptr = “hello world”; 这一句是将字符指针ptr指向字符串“hello world”的首地址‘h’的位置。
四、sizeof和strlen
strlen:针对字符串的函数
sizeof:求空间大小
例:
int a[100] ={0,1,2,3,4,5,6};
printf(“%d\n”,sizeof(a)); 结果:400
printf(“%d\n”,sizeof(a[0])); 结果:4
strlen(a); 会出现问题
五、NULL和指针
在c语言stdio.h中NULL被定义成:#defineNULL ((void *)0)。
(void *)0表示把数值 0 强制转换为void*类型,最外层的( )把宏定义的内容括起来,我们自己进行宏定义时也推荐这么做,防止发生歧义。
但是判断指针变量为不为0的时候,用if(ptr != NULL); 不允许用0来做比较;可以用char *ptr = NULL; 来初始化ptr,但是ptr还是不能使用;必须赋地址才行;
六、指针数组和数组指针
(1)指针数组:
int *str[4] = {“hello”, “world”, “yes”,“what”} ;
str[0]存放的是“hello”的首地址
str[1]存放的是“world”的首地址
str[2]存放的是“yes”的首地址
str[3]存放的是“what”的首地址
(2)数组指针:
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];-------数组指针
p = a ;
p放的是a的第0行首地址
p+1放的是第1行首地址
p+2放的是第2行首地址
p+3放的是第3行首地址
例1:(行指针变量)
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int(*p)[4];
int i, j;
p = a;
for(i=0; i<3;i++)
{
for(j=0; j<4; j++)
{
printf(“%3d”, *(*(p+i)+j));
}
printf(“\n”);
}
结果 1 2 3 4
5 6 7 8
9 10 11 12
例2:(列指针变量)
int a[3][4] ={1,2,3,4,5,6,7,8,9,10,11,12} ;
int *p;
for(p=a[0];p<a[0]+12; p++)
{
printf(“%3d”,*p);
}
结果: 1 2 3 4 5 6 7 8 9 10 11 12
总结:
指针数组里面的元素存放的是指针(地址),当给数组赋值后,没个指针分别指向对应字符串的首地址。
数组指针p指向的是第0行的首地址,加1后(p+1)指向第一行的首地址。
在二维数组中,a[0]表示的是第0行0列的首地址,可直接向指针(p)赋值。
在数组指针中, *(*p+i)------表示取出数组第一行的各个值,
**(p+i)------表示取出数组每一行首个值