1 定义指针变量
指针是C语言中非常重要的数据类型,指针变量的实质是内存地址。其定义的格式为:数据类型 *指针变量名; 比如int *p;
void change(int *n);
// 格式:变量类型 *变量名;
// 定义了一个指针变量p
// 指针变量只能存储地址
// 指针就一个作用:能够根据一个地址值,访问对应的存储空间
// 指针变量p前面的int:指针变量p只能指向int类型的数据
int main()
{
/*先定义后赋值
int a = 10;
int *p;
p = &a; //赋值
printf(“%d”, *p);
*p = 9; //修改值
*/
/* 定义的同时赋值
int a = 10;
int *p = &a;
// 清空指针
p = 0;
// p = NULL;
// 清空指针后,不能再间接访问其他存储空间
// *p = 100.7;
*/
/*实现修改实参
int a = 90;
change(&a);
printf("%d\n", a);
*/
/* 不建议的写法, int *p只能指向int类型的数据
int *p;
double d = 10.0;
p = &d;*/
/* 指针变量只能存储地址
int *p;
p = 200;
*/
/* 指针变量未经过初始化,不要拿来间接访问其他存储空间
int *p;
printf("%d\n", *p);
*/
/*任何指针都占用4个字节的存储空间
char c; // 1
int a; // 4
long b; // 8
char *cp;
int *ap;
long *bp;
printf("cp=%d, ap=%d, bp=%d\n",
sizeof(cp),
sizeof(ap),
sizeof(bp));
*/
return 0;
}
void change(int *n)
{
*n = 10;
}
2 指针与数组
数组名其实质是一个指针,但是它和普通的指针变量还是有区别的,数组名是指针常量
int main()
{
int ages[5] = {10, 9, 8, 67, 56};
int *p;
// 指针变量p指向了数组的首元素
// 数组名就是数组的地址,也是数组首元素的地址
p = ages;
//p = &ages[0];
/*
p ---> &ages[0]
p + 1 ---> &ages[1]
p + 2 ---> &ages[2]
p + i ---> &ages[i]
*/
//访问数组元素
/*
1.数组元素的访问方式
int ages[5];
int *p;
p = ages;
1> 数组名[下标] ages[i]
2> 指针变量名[下标] p[i]
3> *(p + i)
2.指针变量+1,地址值究竟加多少,取决于指针的类型
int * 4
char * 1
double * 8
*/
printf("%d\n", *(p+2));
printf("%d\n", p[2]);
return 0;
}
3 指针与字符串
字符串除了可以用字符数组保存外,用字符指针也可以表示一个字符串。
1 利用数组
char name[] = "itcast";
* 特点:字符串里面的字符是可以修改的
* 使用场合:字符串的内容需要经常修改
2 利用指针
char *name = "itcast";
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
int main()
{
//字符指针
char *name = "itst";
// 字符指针数组(字符串数组)
char *names[5] = {"jack", "rose", "jake"};
printf("%s\n", name);
printf("%s\n", names[0]);
return 0;
}
4 指向函数的指针
函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。 定义的一般形式:函数的返回值类型 (*指针变量名)(形参1, 形参2, ...); 由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的
int sum(int a, int b)
{
return a + b;
}
int main()
{
// 定义指针变量指向sum函数
// 左边的int:指针变量p指向的函数返回int类型的数据
// 右边的(int, int):指针变量p指向的函数有2个int类型的形参
int (*p)(int, int);
p = sum;
//两种调用方式
int c = p(10, 11);
c = (*p)(10, 11);
printf("c is %d\n", c);
return 0;
}