初识指针——指针的计算

  • *(p+1)中“+1”指的是加上sizeof(*p),“-1”是相同的道理。

#include <stdio.h>
int main()
{
    //char类型的数组
	char a[]={0,1,2,3,4,5,6,7,8,9};
	char *p=a;
	printf("sizeof(*p)=%d\n",sizeof(*p));
	printf("p=%p\n",p);
	printf("p+1=%p\n",p+1);
    //int类型的数组
	int b[]={0,1,2,3,4,5,6,7,8,9};
	int *q=b;
	printf("sizeof(*q)=%d\n",sizeof(*q));
	printf("q=%p\n",q);
	printf("q+1=%p\n",q+1);
	return 0;
}
  • 两个指针相减的结果是【(两个指针的地址差)/sizeof(*p)】。

#include <stdio.h>
int main()
{
	char a[]={0,1,2,3,4,5,6,7,8,9};
	char *p=a;
	char *p1=&a[5];
	printf("p1-p=%d\n",p1-p);


	int b[]={0,1,2,3,4,5,6,7,8,9};
	int *q=b;
	int *q1=&b[6];
	printf("q1-q=%d\n",q1-q);
	return 0;
}
  •  *p++

  1. 取出p所指的那个数据来,完事之后顺便把p移到下一个位置
  2. ++运算符的优先级高于*运算符
  3. 通常用于数组类的连续空间操作 
#include <stdio.h>
int main()
{
	char a[]={0,1,2,3,4,5,6,7,8,9,-1};
	char *p=a;
    //遍历数组a
	while(*p!=-1)
	{
	    printf("%d\n",*p++);
	}
	return 0;
}
  • 指向不同类型的指针不能相互赋值
  • void* 指的是不知道指向什么东西的指针
  • 指针也可以转换类型
  • int *p=&i;void *q=(void *)p;
  • 这并没有改变p所指向的变量的类型,而是让后人用不同的眼光通过p看它所指的变量

几道小测试题,第一遍写的时候都没有写对

#include <stdio.h>
#include <stdlib.h>
int main()
{
	char *p;
    while (1)
	{
	    p =(char *)malloc(1);
	    *p = 0;
    }
	return 0;
} 

 最后程序会因为向0地址写入而退出。

原因:当没有内存可以malloc给你的时候,malloc返回0。


#include <stdio.h>
#include <stdlib.h>
int main()
{
	int a[] = {1,2,3,4,5,};
	int *p = a;
	int *q = &a[5];
	printf("%d", q-p);
	return 0;
} 

结果输出为5。

猜你喜欢

转载自blog.csdn.net/jiangxiaoshan123/article/details/81541163