MJ老师说过没学好指针 等于没学C语言。c语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是c语言的灵魂,一点都不为过。C中函数调用是按值传递的,指针所做的是地址的传递。(*p)操作是返回p 的值作为地址的那个空间的取值。(&p)则是这样一种运算,返回当时声明p 时开辟的地址。
一、指针变量的定义
1. 格式:变量类型 *指针变量名;
2. 举例:int *p; char *p2;
3. 注意:定义变量时的*仅仅是指针变量的象征
4. 指针变量只能存储地址
5. 指针就一个作用:能够根据一个地址值,访问对应的存储空间
6. 指针变量p前面的int:指针变量p只能指向int类型的数据
7. 指针变量未经过初始化,不要拿来间接访问其他存储空间
8. 任何指针都占用8个字节的存储空间
二、利用指针变量简单修改其他变量的值
1.指向某个变量
int a;
int *p;
p = &a;
或者
int *p = &a;
2.修改所指向变量的值
*p = 10;
3.在函数内部修改外面变量的值
int a = 10;
change(&a);
void change(int *n)
{
*n = 20;
}
4.指向指针的指针
int a = 10;
int *p = &a;
int **pp = &p;
三、指针与数组
1.将数组当做函数参数传入时,会自动转为指针
1.数组元素的访问方式
int ages[5];
int *p;
p = ages;
1> 数组名[下标] ages
2> 指针变量名[下标] p
3> *(p + i)
2.指针变量+1,地址值究竟加多少,取决于指针的类型
int * 4
char * 1
double * 8指针在内存中的存储方式// 0000 0000 0000 0000 0000 0000 0000 0010int i = 2;// 0000 0001char c = 1;
利用一个指针来接收一个数组,指针变量指向了数组的首元素,数组名就是数组的地址,也是数组首元素的地址
四、指针与字符串
1.定义字符串的2种方式
1> 利用数组
char name[] = "itcast";
* 特点:字符串里面的字符是可以修改的
* 使用场合:字符串的内容需要经常修改
2> 利用指针
char *name = "itcast";
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
2. 计算一个字符串的字符个数
int string_len(char *s)
{
// 记录字符的个数
int count = 0;
// 如果指针当前指向的字符不是'\0'
while ( *s != '\0')
{
// 个数+1
count++;
// 让指针指向下一个字符
//s = s + 1;
s++;
}
return count;
}
3.定义字符串数组
1> 利用二维字符数组
char names[2][10] = {"jack", "rose"};
2> 利用指针数组
char *names[2] = {"jack", "rose"};
五.指向函数的指针
定义:
double (*p)(double, char *, int);
p = haha;
或者
double (*p)(double, char *, int) = haha;
3.如何间接调用函数
1> p(10.7, "jack", 10);
2> (*p)(10.7, "jack", 10);
int (*p)(int, int);
// 定义指针变量指向sum函数
// 左边的int:指针变量p指向的函数返回int类型的数据
// 右边的(int, int):指针变量p指向的函数有2个int类型的形参
p = sum;
int c = (*p)(10, 11);
printf("c is %d\n", c);
特例没有返回值的函数
void (*p)();
// (*p)是固定写法,代表指针变量p将来肯定是指向函数
// 左边的void:指针变量p指向的函数没有返回值
// 右边的():指针变量p指向的函数没有形参
void test()
{
printf("调用了test函数\n");
}
p = test; // 指针变量p指向了test函数
p(); // 调用函数等同于test();
这是我博客里总结的一篇,博客已经提交 如果通过后 会将更多博客整理的条目分享给大家
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |