标签:
指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言。
l voidchange(int n)函数调用完毕后,改变实参的值
l 分析:修改实参的值->找到存储空间->地址
l 类名标识符 *指针变量名;
l int*p;
l 简单取值
int a = 10;
int *p;
p = &a;
int a = 10;
int *p = &a;
l 指针变量是用来存放变量地址的,不要给它随意赋值一个常数。下面的写法是错误的
l int *p;
l p = 200; // 这是错误的
l %p输出指针里面存储的地址值
l 其他指针类型说明,比如float *p; char *p;
l 不能乱用类型,比如int a = 10; float *p =&a;
l p =0;
l p =NULL;
l 给指针指向的变量赋值
1 char a = 10;
2 printf("修改前,a的值:%d\n", a);
3
4 // 指针变量p指向变量a
5 char *p = &a;
6
7 // 通过指针变量p间接修改变量a的值
8 *p = 9;
9
10 printf("修改后,a的值:%d", a);
a值是10,p值就是变量a的地址ffc3。
注意下第5、第8行,都有个"*",它们的含义是不一样的:
(1) 第5行的"*"只是用来说明p是个指针变量
(2) 第8行的"*"是一个指针运算符,这里的*p代表根据p值ffc3这个地址访问对应的存储空间,也就是变量a的存储空间,然后将右边的数值9写入到这个存储空间,相当于 a = 9;,于是内存中就变成这样了
输出结果为: ,可以发现,我们通过变量p间接修改了变量a的值。
l 举例!!!这是mj老师当时举得一个对我印象特别深的例子!!!!!!!!!!!!!!!!!!!
1. 指针变量所占用的存储空间占用8个字节
1 // 定义一个int类型的数组 2 int a[2]; 3 4 // 定义一个int类型的指针 5 int *p; 6 7 // 让指针指向数组的第0个元素 8 p = &a[0]; 9 10 //修改所指向元素的值11 *p = 10;12 13 // 打印第一个元素的值14 printf("a[0] = %d", a[0]);
1 // 定义一个int类型的数组 2 int a[4] = {1, 2, 3, 4}; 3 4 // 定义一个int类型的指针,并指向数组的第0个元素 5 int *p = a; 6 7 int i; 8for (i = 0; i < 4; i++) { 9 // 利用指针运算符*取出数组元素的值10 int value = *(p+i);11 12 printf("a[%d] = %d \n", i, value);13 }
p是指针,a是一个数组
char *s;
s = "mj";
上面的指向方式也是正确的:先定义指针变量,再指向字符串。如果是字符数组就不允许这样做,下面的做法是错误的:
1 char s[10];
2 s = "mj";
编译器肯定报第2行的错,因为s是个常量,代表数组的首地址,不能进行赋值运算。
还需要注意的是,下面的做法也是错误的:
1 char *s = "mj";
2
3 *s = "like";
第3行代码犯了2个错误:
· 第3行代码相当于把字符串"like"存进s指向的那一块内存空间,由第1行代码可以看出,s指向的是"mj"的首字符‘m‘,也就是说s指向的一块char类型的存储空间,只有1个字节,要"like"存进1个字节的空间内,肯定内存溢出
· 由第1行代码可以看出,指针s指向的是字符串常量"mj"!因此是不能再通过指针来修改字符串内容的!就算是*s = ‘A‘这样"看起来似乎正确"的写法也是错误的,因为s指向的一个常量字符串,不允许修改它内部的字符。
现在想将字符串"lmj"的首字符‘l‘改为‘L‘,解决方案是多种的
1 char *p2 = "lmj";
2 *p2 = ‘L‘;
3
4 printf("%s", p2);
看起来似乎是可行的,但这是错误代码,错在第2行。首先看第1行,指针变量p2指向的是一块字符串常量,正因为是常量,所以它内部的字符是不允许修改的。
有人可能搞蒙了,这里的第1行代码char *p2 = "lmj";跟第一种方案中的第2行代码char a[] = "lmj";不是一样的么?这是不一样的。
· char a[] = "lmj";定义的是一个字符串变量!
· char *p2 = "lmj";定义的是一个字符串常量!
标签:
原文地址:http://www.cnblogs.com/zhangxining/p/4175016.html