1、指针变量的定义
int a;
int *p = &a;
* 表示这个变量是一个指针,int代表这个指针所指向的地址中保存的数据的类型,也可以是char、double等类型,但必须和指针所指向的地址中保存的数据类型一致。
指针变量中保存的是地址,所以必须将a的地址赋值给指针变量p。
2、指针变量的大小
指针变量的大小只与编译器的位数有关,由于指针内部存的是地址,32为情况下地址都是32位的,所以在32位的编译器下指针都是4个字节,在64位编译器下则是8个字节。
3、指针变量的取值
在变量定义时 * 号代表该变量为指针变量,在使用指针变量时*号代表取指针所指向的那块内存的值也就是说 *+地址 表示指针指向的那块内存的值。
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
int *pa = &a;
int *pb = &b;
// 通过 pa 与 pb 交换 a 与 b 的值
int tmp = *pa;
*pa = *pb;
*pb = tmp;
return 0;
}
4、数组指针
指向数组的指针叫数组指针,数组名代表数组首个元素的地址
如:int a[5];
a = &a[0],&a是数组的地址要和数组首个元素的地址区分开。
数组名代表数组首个元素的地址,在某些场合可以当指针使用。
数组指针与数组的差异1:数组指针不能代替数组名求数组长度。(指针在32位编译器下永远是4个字节)
数组指针与数组的差异2:数组是一个常量不能改变。(不能出现数组名自加或者自减的情况)
#include <stdio.h>//指针方式逆序数组
int main()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int *p1 = a; // 指向数组的第一个元素
int *p2 = a + sizeof(a)/sizeof(a[0]) - 1;
while (p1 < p2)
{
int tmp = *p1;
*(p1++) = *p2;
*(p2--) = tmp;
}
int i;
for (i = 0; i < 10; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
return 0;
}
5、字符串指针
字符串指针的使用方法和数组指针差不多,字符串指针是用来指向字符串数组或者字符串常量的。
#include <stdio.h>
#include <string.h>
int main1()
{
char ch[] = "hello";
char *pch = ch;
printf ("%s\n",pch);
int i;
for (i = 0; i < strlen(ch); i++)
{
printf ("%c", *(pch+i));
}
putchar ('\n');
puts(pch);
char str[10];
char *pstr = str;
scanf ("%s", pstr);
puts(str);
return 0;
}
典型错误1:将一个字符串写到一个没有初始化的指针位置即野指针。
典型错误2:用指针去修改一个字符串常量的值。
一个字符串常量可一代表这个字符串的首地址,可以用 char* 类型的指针指向它。
#include <stdio.h>//句子逆序
#include <string.h>
int main()
{
// char *p = "I am from shanghai";
// char str[] = "I am from shanghai";
char str[] = "you are from shanghai";
// 将整个字符串逆序
char *p1 = str;
char *p2 = str + strlen(str) - 1;
char *p3 = NULL; // 用于将单词逆序
char tmp;
while (p1 < p2)
{
tmp = *p1;
*(p1++) = *p2;
*(p2--) = tmp;
}
puts(str);
// 再将每一个单词进行逆序,单词通过空格去找
p1 = str;
p2 = str;
while(*p2) // p2找到字符串结束为止
{
if (*p2 == ' ') // 找到一个单词,要将前面的单词进行逆序
{
p3 = p2 - 1;
while (p1 < p3)
{
tmp = *p1;
*(p1++) = *p3;
*(p3--) = tmp;
}
p1 = p2 + 1;
}
p2++;
}
p3 = p2 - 1;
while (p1 < p3)
{
tmp = *p1;
*(p1++) = *p3;
*(p3--) = tmp;
}
puts(str);
return 0;
}
6、指针数组
一个数组,数组内的每个元素都是指针。
7、二维数组指针
int a[3][5]
int (*p)[5] = a;