linux c语言 指针修改 某个结构的值,全面复习linux C语言系列--第一讲--基础知识...

看别人code的时候,发现很多基础的知识都不牢固,东找西找,总算明白,可是总是觉得自己的知识没有成体系,需要总结有一下,方便以后的工作和学习!

全面复习linux C语言系列 我希望能坚持写完,估计会有20讲,每天都写一点吧!希望自己能坚持下去!

变量的存储类型:

1.auto

在函数中申明的变量,如果不进行特殊的说明都是自动变量,在系统调用这些变量所在的函数时候,系统将从堆栈中自动分配存储空间,在函数返回后,将由系统自动释放这些空间。默认存贮类型就是auto的

2. static

static 声明的变量在2次调用间保持原值,也就是说static声明的变量,在两次调用间,其存储空间不会被系统自动释放,static 变量在编译的时候赋初值,在运行过程中,除非使用复制语句,否则不会对变量赋值!

例子:

#include

main()

{

int i;

for(i=0;i<3;i++)

printf("%d\n",func(1));

}

int func(int x)

{

static int n=5;

n += 1;

return x+n;

}

上面这个程序的运行结果是

7

8

9

如果去掉 static 则 结果是

7

7

7

3. extern

extern变量也成为外部变量,是在函数外部定义的变量。通畅可在头文件中定义外部变量,在源代码中用extern 声明后引用!

4.register

也成为寄存器变量,为了提高程序的运行效率,将使用频率高的变量直接存储到寄存器中,而不是保存到内存中!

sizeof 和 strlen的区别:

sizeof 求字符串变量的长度时候,是指整个字符串数组的长度,而用strlen求得的字符串长度不包括最后的字符串结束符

数组,结构,指针:

C语言的参数传递有传值和传地址两种方式(c ++多了 一中 引用传递)

c语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。指针变量作函数参数也要最循这一规则。调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指变量的值。

1. 值传递  Exchg1

2. 地址传递 Exchg2

例子

[root@xhu-vm test]# more test1.c

#include

void Exchg1(int x, int y)

{

int tmp;

tmp=x;

x=y;

y=tmp;

printf("Exchg1:x=%d,y=%d\n",x,y);

}

void Exchg2(int *x, int *y)

{

int tmp;

tmp=*x;

*x=*y;

*y=tmp;

printf("Exchg3:x=%d,y=%d\n",*x,*y);

}

int main()

{

int a=4,b=6;

Exchg1 (a,b) ;

printf("a=%d,b=%d\n",a,b);

Exchg2 (&a,&b);

printf("a=%d,b=%d\n",a,b);

}

运行结果

[root@xhu-vm test]# gcc test1.c -O -o test1

[root@xhu-vm test]# ./test1

Exchg1:x=6,y=4

a=4,b=6

Exchg3:x=6,y=4

a=6,b=4

[root@xhu-vm test]#

指向另一指针的指针 :

设计一个函数:void find1(char array[], char search, char *pa)

要求:这个函数参数中的数组array是以0值为结束的字符串,要求在字符串array中查找字符是参数search里的字符。如果找到,函数通过第三个参数(pa)返回值为array字符串中第一个找到的字符的地址。如果没找到,则为pa为0。

[root@xhu-vm test]# more test2.c

#include

void find2(char array[], char search, char **ppa)

{

int i;

for (i=0; *(array + i) != 0; i++)

{

if(*(array + i) == search)

{

*ppa = array + i;

break;

}

else if(*(array + i) == 0)

{

*ppa = 0;

break;

}

}

}

int main()

{

char str[] = {"afsdfsdfdf\0"}; /* 待查找的字符串 */

char a = 'd';/* 设置要查找的字符 */

char *p = 0; /* 如果查找到后指针p将指向字符串中查找到的第1个字符的地址。 */

find2(str, a, &p); /* 调用函数以实现所要操作。 */

if (0 == p)

{

printf("没找到!\n"); /* 如果没找到则输出此句 */

}

else

{

printf("找到了,p = %d\n", p); /* 如果找到则输出此句 */

}

return(0);

}

结果:

[root@xhu-vm test]# gcc test2.c -O -o test2

[root@xhu-vm test]# ./test2

找到了,p = -1075071597

[root@xhu-vm test]#

分析:

ppa指向指针p的地址

对*ppa的修改就是对p值的修改

函数指针:

就象某一数据变量的内存地址可以存储在相应的指针变量中一样,函数的首地址也以存储在某个函数指针变量里的。这样,我就可以通过这个函数指针变量来调用所指向的函数了。

a.通过函数指针变量调用函数

[root@xhu-vm test]# more test3.c

#include

void MyFun(int x);

void (*FunP)(int);

int main()

{

//case1

MyFun(10);

//case2

FunP=MyFun;

(FunP)(20);

//case3

FunP=&MyFun;

(*FunP)(30);

}

void MyFun(int x)

{

printf("%d\n",x);

}

[root@xhu-vm test]#

运行结果:

[root@xhu-vm test]# ./test3

10

20

30

2中方式: 1.将调用函数的地址付给函数指针变量

2. 直接将函数名字赋给 函数指针变量

b. 函数指针作为某个函数的参数

[root@xhu-vm test]# more test4.c

#include

void MyFun1(int x);

void MyFun2(int x);

void MyFun3(int x);

typedef void (*FunType)(int); /* ②. 定义一个函数指针类型FunType,与①函数类型一致 */

void CallMyFun(FunType fp,int x);

int main(int argc, char* argv[])

{

CallMyFun(MyFun1,10); /* ⑤. 通过CallMyFun函数分别调用三个不同的函数 */

CallMyFun(MyFun2,20);

CallMyFun(MyFun3,30);

}

void CallMyFun(FunType fp,int x) /* ③. 参数fp的类型是FunType。*/

{

fp(x);/* ④. 通过fp的指针执行传递进来的函数,注意fp所指的函数是有一个参数的。 */

}

void MyFun1(int x) /* ①. 这是个有一个参数的函数,以下两个函数也相同。 */

{

printf("函数MyFun1中输出:%d\n",x);

}

void MyFun2(int x)

{

printf("函数MyFun2中输出:%d\n",x);

}

void MyFun3(int x)

{

printf("函数MyFun3中输出:%d\n",x);

}

执行结果:

[root@xhu-vm test]# ./test4

函数MyFun1中输出:10

函数MyFun2中输出:20

函数MyFun3中输出:30

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值