1. 使用指针指向数组
int
这种输入方式是错误的,因为数组名代表数组首元素的地址,是一个指针型常量,其值在程序运行期间是固定不变的。所以a++是无法实现的。
int a[10];
int *p = a;
for(i = 0;i<10;i++){
scanf("%d", p++);
}
for(i = 0;i<10;i++){
printf("%d",*p++);
}
上面这个代码块的输入部分是正确的,但是输入部分错了。因为在进行输出的时候,没有让p重新指向数组首地址。这样的话,在第二个for循环开始时,p的值为a+10。
因此应该在第二个for循环处添加代码
p = a;
另外由于++和*同优先级,因此
*p++;
*(p++);
这两个语句等价
2. 使用指针指向字符串
指针可以指向字符串的首地址
char
其中p指针指向的是字符串“I live in China."的首个元素'I',其为字符变量,不是字符串变量。在第二行中,%s代表输出字符串,首先输出p所指向的首个元素'I',然后对p进行“+1”操作,让p指向字符串的第二个元素' ',如此循环下去,指导p指向的元素为字符串终止符'0'。需要注意的是,p不代表整个字符串,只是代表字符串的首地址。在输出字符串的时候,使用‘%s’表示输出整个字符串
同样的对于字符串数组
char str[]="I live in WuHan.";
printf("%sn",str);
其中数组名同样是一个指针,指向第字符串的第一个元素。
注意:c语言中是没有字符串变量的,但是我们在输出字符串时,可以通过'%s'和字符串的首地址来输出字符串。
3. 字符串数组的终止符'0'
int
上面这个函数,乍一看好像没什么问题。但是需要注意的是,在for循环中,没有把a数组中的字符串终止符'0'赋值给b数组,这就导致了输出b数组时除了"I am a programmer."外,还会输出一些不知道什么字符,只有当b数组中出现'0'时(随机),才会终止输出
4. 指针的运算
int *p, *p1;
int array[10], num;
int max();
p = array; //将数组array的首地址赋值给指针变量p
p = &array; //将数组array的地址赋值给指针变量p
p = &array[0]; //将数组array的首地址赋值给指针变量p
p = &array[1]; //将数组array的第二个元素的地址赋值给指针变量p
p = p1; //将指针变量p1的值赋值给指针变量p
p = # //将num的地址赋值给指针变量p
p = max; //将函数max的入口地址赋值给指针变量p
p++; //将指针变量p加1,其值加上定义的*p的类型所占的字节数,这里*p的类型为int,则在p的值(所指向变量的地址)的基础上加4
需要注意的是,p = array与p = &array是不同的,虽然arry与&array的值相同,但是他们所代表的意义不同,一个是数组的首地址,一个是数组的地址。
int array[10];
printf("%d %d %d %d",array, &array, array+1,(&array+1));
运行结果分别是:
![866906dfa721e34546b4e8e7a55a67c6.png](https://i-blog.csdnimg.cn/blog_migrate/e815d83fbe37bcb2d6fe214b4e8cb0f2.png)
可见&array+1是在array[9]的地址的基础上加4(即int所占的4个字节)。
5. 指针和指针变量
int
注意,指针变量是指变量p,而指针是指变量p所存储的地址本身。