C语言高速入口系列(七)
C语言指针进阶
本章引言:
在前面第5节中我们对C语言的指针进行了初步的学习理解;作为C语言的灵魂,
C指针肯定没那么简单,在这一节中,我们将会对指针进行进一步的学习,比方二级指针,
指针数组,内存分配和const修饰指针常量等!以下就请大家尾随笔者的脚步,对
C指针神奇的一面进行进一步的解析吧!
本节学习路线图:
函数与指针:
①指针作为函数的形參:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZXJfcGln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
②指向函数的指针:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZXJfcGln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
③指针函数:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZXJfcGln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
④带參数的主函数
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZXJfcGln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
ps:该代码的执行:先要编译生成exe文件后,来到exe所在文件文件夹下:输入: 文件名称 one two three
会输出:one two three
指针数组:
两个问题:怎样保存一个字符串?假设保存的不止一个,而是多个呢?
第一个问题:
①char name[20] = "~~~" ②char *name = "~~~" //前者定义了长度,不能直接赋值,明显后者比較灵活
第二个问题:见图
二级指针:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZXJfcGln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
内存的动态分配:
代码演示样例:
动态分配10个整型的空间大小,假设大于这个数目则动态分配,否则利用realloc又一次分配内存
ps:代码没问题,vc6一直报执行时错误,假设出错了,用C-Free或者Visual studio等编译器试试!
<span style="font-family:Microsoft YaHei;">#include <stdio.h>
#include <stdlib.h>
#define N 10 int main()
{
int *p = 0;
int i,num,*q = 0;
p = (int *)malloc((N * sizeof(int)));
if(p == 0)
{
printf("内存分配错误!\n");
exit(0);
}
printf("请输入要存储的元素个数:\n");
scanf("%d",&num);
if(num <= N)
{
for(i = 0;i < N;i++)
scanf("%d",p+i);
}
else
{
for(i = 0;i < num;i++)
q = (int *)realloc(p,(N + N)*sizeof(int));
if(q == 0)exit(0);
for(i = 0;i < num;i++)
scanf("%d",q + i);
p = q;
}
for(i = 0;i < num;i++)
printf("%3d",*(p+i)); printf("\n");
free(p);
return 0;
}</span>
使用const修饰指针变量
我们都知道使用const修饰一个基本数据类型的变量,能够让变量存储的值从头到尾都不变
我们的程序不能进行改动!
只是修饰指针变量就有点差异了:
比方:
int a = 3,b = 4; const int *p = &a;
假设我们再加入一句代码: p = &b;的话就会报错
假设加入: a = 5;代码并不出错,此时 *p == a == 5;
分析结果:
使用const修饰指针时,表明该指针是一个常量指针,它所指向的变量的值是能够改动的;
可是改动指针指向的地址则是错误的。!
!
在C很多的标准库函数都将某些指针參数的类型前加上const,目的是保护參数!
ps:int *const p = &a; const int * const p = &a; 和上面的都是等价的!
本章小结:
①函数与指针:
1.指针作为函数的形參: 指针參数相应的实參须要为变量地址
2.指向函数的指针:函数的首地址称为函数的指针,通过函数名能够找到而且运行函数
3.指针函数:返回值类型是一个指针
4.带參数的主函数: int main(int argc,char *argv[]) :形參依次为:记录參数个数和存储參数内容的字符串数组
②指针数组
二维数组存放字符串与指针数组存放字符串的比較
③二级指针
指向指针变量的指针
④内存的动态分配:
1.内存分配图
2.C语言提供的四个内存分配函数的使用:malloc(),calloc(),realloc(),free()的使用
⑤使用const修饰指针变量
能够改动的指向地址的变量的值,不能改动的是指针所指向的地址!
版权声明:本文博主原创文章。博客,未经同意不得转载。