C语言的学习进展到了指针的部分,这部分是C语言的精华所在,指针用的好,C语言才会用的好,所以我也是花了很大心思去学习指针。在Linux系统下编写不少函数,试图让在自己多接触,多熟悉指针。以下便是我整理的一些知识点与编写的函数。
一、变量的存储类型
1、BSS段 (未初始化的全局变量和静态数据区)
2、数据段(初始化的全局变量)
3、代码段 (代码、常量)
4、堆 (用户管理 malloc)
5、桟(操作系统 形参)
(1)自动变量 auto动态地分配存储空间,存储在动态存储区
(2)对于使用频繁的变量,可以使用register声明为寄存器变量,其值存储在cpu中,加快了运行速度。
(3)静态局部变量(Static 局部变量)有时希望函数中的局部变量的值在函数调用后不消失而继续保留其值。
(4)用extern 声明外部变量 外部变量即全局变量是在函数外部变量定义的,它的作用域为从变量的定义处开始,到本程序文件的末尾
1 在一个文件内扩展外部变量的作用域
2在多个文件的程序中声明外部变量
3外部变量只限于被本文件引用,而不能被其他文件引用,可以在定义外部变量时加一个static声明。
二、指针
一、 1、*(p++)=*p++ 先取p的值再使p+1;
2、*(++p)先使p+1,再取*p;
3、(*p)++先取p的值再使值加1;
4、++*p使p的值加1
二、
#include <stdio.h>
int my_strlength(char *str)
{
int k = 0;
while(*str != '\0')
{
str++;
k++;
}
return k;
}
int main()
{ int n;
char a[10] = {"abcde"};
n = my_strlength(a);
printf("%d\n",n);
return 0;
}(用指针实现求字符串的长度 这题较为简单用while循环就行)
三、
#include <stdio.h>
char *mystrcpy(char *str1,char *str2)
{ char *tmp = str1;
while((*str1++ = *str2++) != '\0');
return tmp;
}
int main()
{
char a[30] = {"hello"};
char b[20] = {"hey boy"};
char *p;
p = mystrcpy(a,b);
printf("%s\n",p);
return 0;
}(实现strcpy函数,子函数开始要定义一个初始地址)
三、
#include <stdio.h>
#include <string.h>
void fun(char *a, char *b)
{ char *p = a;
char *q = b;
int i = 0;
int length = strlen(a);
p = p+length-1;
for(i = 0; i<length; i++)
{
*b = *p;
p--;
b++;
}
printf("%s\n",q);
}
int main()
{
char str[20] = {"hello world!"};
char ptr[20] ={0};
fun(str,ptr);
return 0;
}(将字符串首尾倒置 这一题主要注意p的末尾下标和如何去表示)
四、
1、把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函 数指针变量”。
函数指针变量定义的一般形式为:
类型说明符 (*指针变量名)();
例如: int (*pf)();
2、1) 所谓函数类型是指函数返回值的类型。
在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。
2)定义指针型函数的一般形式为:
类型说明符 *函数名(形参表)
3、int *(*(*fp)(int))[10]; fp是一个指针指向函数参数为int型返回一个指针,指针又指向一个数组返回值为int*型指针
int *(*(*array[5])())(); array[5]是指针指向函数无参数返回一个指针,指针又指向一个函数,无参数,返回值为int*型指针
4、
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *str[10] = {0};
int i;
for(i = 0;i < 4; i++)
{
str[i] = (char *)malloc(sizeof(char)*10);
scanf("%s", str[i]);
}
for(i = 3; i >= 0; i--)
{
printf("%s ",str[i]);
}
printf("\n");
return 0;
} (这题字符串单词倒置用指针数组相对简单些,不过初始化为0时都是野指针需要malloc分配空间)
5、
main (int argc,char *argv[])
argc(第一个形参)必须是整型变量,
argv( 第二个形参)必须是指向字符串的指针数组。
argc参数表示了命令行中参数的个数(注意:文件名本身也算一个参数);
argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。 针数组的长度即为参数个数。
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
int i, num1,num2;
char opt;
num1 = atoi(argv[1]);
num2 = atoi(argv[3]);
strncpy(&opt, argv[2], 1);
switch(opt)
{
case '+':
printf("result :%d\n", num1 + num2);
break;
case'-':
printf("result :%d\n",num1 - num2);
break;
case'x':
printf("result :%d\n",num1 * num2);
break;
case'/':
printf("result :%d\n",num1 / num2);
break;
}
return 0;
} (通过main函数参数输入实现简易计算器的功能 )