C程序员的环境变量和环境表
C语言中环境存储在字符指针数组中,就是环境表;
环境表可以看成是二级指针,用来指定环境变量;
char *s[5]; //字符指针数组,元素是字符指针;
char **s; //二级指针
环境表的使用只需要写上 extern char** environ; //外部全局变量
environ就是环境表的首地址;
echo $OLDPWD
指针的回顾
指针就是一个存储另一个变量地址的变量;
int i = 10;
int *pi = &i;
pi就是指针,i就是普通整型变量;
*pi == i
&i == pi
指针的运算
支持加法和减法,但加法只能加上整数;
pi + 1 就是移动指针, 移动的字节数由指向变量的类型决定;
如果pi是 int *, 移动4个字节;
如果是 char *, 移动1个字节;
如果pi是 char **, 移动 char*的大小,即4个字节;
sizeof(指向的类型);
*p++ 先做p++再取*;但后++会在语句结束时才做;
(*p)++ 先取*再++;
如果 char** p, (*p)++导致*p移动一个字节,p不动;
char *str[5]; //指针数组,存放指针的数组(char *)str[5];
char (*str)[5]; //数组指针,指向数组的指针;
一定要多练
C语言中环境存储在字符指针数组中,就是环境表;
环境表可以看成是二级指针,用来指定环境变量;
char *s[5]; //字符指针数组,元素是字符指针;
char **s; //二级指针
环境表的使用只需要写上 extern char** environ; //外部全局变量
environ就是环境表的首地址;
echo $OLDPWD
指针的回顾
指针就是一个存储另一个变量地址的变量;
int i = 10;
int *pi = &i;
pi就是指针,i就是普通整型变量;
*pi == i
&i == pi
指针的运算
支持加法和减法,但加法只能加上整数;
pi + 1 就是移动指针, 移动的字节数由指向变量的类型决定;
如果pi是 int *, 移动4个字节;
如果是 char *, 移动1个字节;
如果pi是 char **, 移动 char*的大小,即4个字节;
sizeof(指向的类型);
*p++ 先做p++再取*;但后++会在语句结束时才做;
(*p)++ 先取*再++;
如果 char** p, (*p)++导致*p移动一个字节,p不动;
char *str[5]; //指针数组,存放指针的数组(char *)str[5];
char (*str)[5]; //数组指针,指向数组的指针;
一定要多练
/*
* C程序员的环境变量与环境表练习
*/
#include <stdio.h>
#include <string.h>
int main() {
extern char **environ; //全局变量,改变了有影响
char **p = environ; //p是局部变量,改变了无影响
//p是字符指针数组;
//练习:写一个循环打印所有环境变量(数组元素),数组以NULL结束
while (*p /* != NULL */ ) { //可以省略,C程序效率十分重要
printf("%s\n", *p);
/* printf("\t%p\n", p); */
p++;
}
//写一个循环,把LANG的值取出来,存入value中
//提示:比较字符串的前n个字符strncmp();
p = environ; //指针回到开始;
char value[100] = { };
while (*p) {
if (!strncmp(*p, "LANG=", 5)){
/* printf("%s\n", *p); */
strcpy(value, (*p) + 5);
break;
}
p++;
}
printf("value = %s\n", value);
return 0;
}