C语言:给main传参、指针
一、给main函数传参:
???argc : 代表的是执行程序时,给main函数传递的参数的个数;
???argv[i]:代表的是执行程序时,给main函数传递的具体的参数
????例如:
?????./a.out??12????hj????k???y????m???4
???????|????|?????|?????|???|?????|???|
?????argv[0]?argv[1]?argv[2]?argv[3]?argv[4]?argv[5]?argv[6]
?????此时argc的值为7
点击查看代码
#include
int main(int argc, char *argv[])
{
int i = 0;
printf("argc=%d\n",argc);
for(i=0; i
练习、给main函数传参,参数是一个五位数的字符串,转换成数字输出
???./a.out??12345
???字符 1(ascii:49) 和 字符 0(ascii:48) 之间的ASCII码之间相差1,所以当字符1 减去 字符 0时,它们的ASCII码之差就是 数字1 ;
???同理其它字符型数字 也可以直接减去字符0 就可以得到对应的整形数字。
二、指针:指针就是内存中的地址
???地址可分为:物理地址,逻辑地址和线性地址。
???在C语言中,使用取地址符 ?& ?取到的地址值,是逻辑地址。
???逻辑地址是相对于当前进程数据段的地址(偏移地址),不和绝对的物理地址直接相关联。
???逻辑地址不是被直接送到内存总线,而是送到内存管理单元(MMU)。MMU由一个或一组芯片组成,其功能就是把逻辑地址映射为物理地址,即进行地址转换。
???
引用来源:
???1、指针的组成
?????存储类型 数据类型 * 变量名 = value;
?????例如:auto?char?* p = NULL;
???2、野指针:指针指向一个不合法的地址,那么在操作的时候有可能会报段错误;
?????注:如果p指针还未指向任何地址的前提下:
????????p = a;//错误,不能这样写。 p必须指向一个地址,p=a,将a赋值给p指向的变量,但是由于p没有指向地址,所以这句话是错误的。
????? 即:指针必须要遵守先初始化,再使用的原则;
???????1、定义指针
???????2、分配内存(使指针指向某个地址)
???????3、使用
???????注:在定义指针时,没有为该指针分配内存(赋初值),则这个指针就叫做野指针。野指针肯能导致不可预期的后果。
?????实例:
????????int a =10;
????????int p = &a; //将p指针指向变量a
????????//p = &a;
????????printf("p = %d\n",p); //p 代表取a中的内容(*p = a)
????????*p = 100;
????????printf("a = %d\n",a);
????????printf("&a = %p,p = %p,&p = %d\n",&a,p,&p);??//&a 代表a的地址??p=&a (a的地址) &p 代表取p变量的地址(指针变量的地址)
???3、如何规避野指针?
??????在定义指针的时候赋值NULL,在释放后赋值NULL;
???4、使用指针变量的应用:
?????代码:
???????void swap1(int a, int b) //不可以实现值的互换(主函数里面的a,b的值并未互换)
???????{
?????????int temp;
?????????temp = a;
?????????a = b;
?????????b = temp;
???????}
???????为什么无法交换?
?????????直接传递参数给函数swap,传递的是变量的拷贝。而不是变量本身。
?????????也就是说在swap函数内部a和b是外部两个参数的拷贝。所以在swap外部看a和b还是原来的值。
???????void _swap2(int *a,int *b) //可以实现数值互换
???????{
?????????int temp;
?????????temp = a;
?????????a = b;
?????????b = temp;
???????}
三、二级指针
???char?q;
???int?p;
???二级指针是指向一级指针的地址。(一般在函数调用的时候使用)
??(1)、二级指针只能存储一级指针的地址。
??(2)、二级指针可以更改一级指针的指向。
点击查看代码
int main()
{
int a = 10;
int *p;
int **q;
p = &a;
q = &p;
printf("a = %d, *p = %d , **q = %d\n",a,*p,**q);
printf("&a = %p, p = %p, &p = %p, q = %p, &q = %q, *q = %p\n",&a,p,&p,q,&q , *q);
}
//输出结果为:
//a = 10 , *p = 10, **q = 10
//&a = 0xbfbb8cc4 , p = 0xbfbb8cc4, &p = 0xbfbb8cc8, q = 0xbfbb8cc8, &q = 0xbfbb8ccc, *q = 0xbfbb8cc4
点击查看代码
//(通过二级指针 q 改变一级指针 p 的值(指向))
void change_data(int **q)
{
**q = 100;
(*q)++;
}
int main( int argc , int argv[ ])
{
int a[2] = {10,9};
int *p = a;
printf("*p = %d\n",*p);
change_data(&p);
printf("a[0] = %d"a[0]);
printf("*p = %d\n",*p);
return 0;
}
//输出结果:
//*p = 10;
//a[0] = 100;
//*p = 9;