整理整理C语言中各种类型指针的特性与用法语言中各种类型指针的特性与用法
指针为什么要区分类型:指针为什么要区分类型:
在同一种编译器环境下,一个指针变量所占用的内存空间是固定的。比如,在16位编译器环境 下,任何一个指针变量都只占用8个
字节,并不会随所指向变量的类型而改变。
虽然所有的指针都只占8个字节,但不同类型的变量却占不同的字节数。
一个int占用4个字节,一个char占用1个字节,而一个double占用8字节;
现在只有一个地址,我怎么才能知道要从这个地址开始向后访问多少个字节的存储空间呢,是4个,是1个,还是8个。
所以指针变量需要它所指向的数据类型告诉它要访问多少个字节存储空间。
也就是说,如果不指定指针的类型,那么当指针指向一个变量的时候,她从首地址开始,但是它不知道什么时候停止,它不知
道要访问多少个存储空间。比如有一个char类型的变量,我用一个指针指向它,但是这个指针我设置成int类型,这样一来这个
指针就会向后访问四个字节的存储空间,很明显得到的结果不是char类型应该得到的,所以要区分类型。
只有指针是可以运算(移动)的,数组名是不可以的。只有指针是可以运算(移动)的,数组名是不可以的。
int x[10];
x++; //illegal
int* p = x;
p++; //legal
两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。
实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。
(pointer2地址值 – pointer地址值) / sizeof(所指向数据类型)
指针之间可以相减,但不可以相加(相加无意义)。
定义字符串:
字符数组:
char string[] = "hello";
printf("%s",string);
字符串指针指向字符串:字符串指针指向字符串:
char *str = "hello"
使用字符数组来保存的字符串是存在”栈”里的,所以它是可读可写的,所以我们可以修改字符数组里的某个元素的值。
但是,使用字符指针来保存字符串,它保存的是字符串常量地址,”常量区”是只读的,所以是不可改的。
char *str = "hello";
*(str+1) = 'w'; // 错误
使用注意:
char *str;
scanf("%s", str);
/* str是一个野指针,他并没有指向某一块内存空间,所以不允许这样写。如果给str分配内存空间是可以这样用的 */
/********* 数组的方法****************/
char name[20];
scanf("%s",name);
/************* 给字符针针分配内存空间的办法***********/
char *name;
name=(char*)malloc(50); //此时name已经指向一个刚刚分配的地址空间。
scanf("%s",name);