指针的学习

来源:互联网 发布:杀破狼js网盘下载 编辑:程序博客网 时间:2024/06/19 01:50

一、*p++++*p用法

1y = *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

2y = ++*p;  *p的内容+1y

例: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’的位置。

 

四、sizeofstrlen

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

strlena);  会出现问题

 

五、NULL和指针

c语言stdio.hNULL被定义成:#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]表示的是第00列的首地址,可直接向指针(p)赋值。

在数组指针中, *(*p+i)------表示取出数组第一行的各个值,

**(p+i)------表示取出数组每一行首个值