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 <stdio.h>
int main(int argc, char *argv[])
{
int i = 0;
printf("argc=%d\n",argc);
for(i=0; i<argc; i++){
printf("%s ", argv[i]);
}
printf("\n");
return 0;
}
//执行结果:
//ubuntu@linux:~$ ./a.out 89 ww qq pp bb rr y7 k2
//argc=9
//./a.out 89 ww qq pp bb rr y7 k2
练习、给main函数传参,参数是一个五位数的字符串,转换成数字输出
./a.out 12345

字符 1(ascii:49) 和 字符 0(ascii:48) 之间的ASCII码之间相差1,所以当字符1 减去 字符 0时,它们的ASCII码之差就是 数字1 ;
同理其它字符型数字 也可以直接减去字符0 就可以得到对应的整形数字。
二、指针:指针就是内存中的地址
地址可分为:物理地址,逻辑地址和线性地址。
在C语言中,使用取地址符 & 取到的地址值,是逻辑地址。
逻辑地址是相对于当前进程数据段的地址(偏移地址),不和绝对的物理地址直接相关联。
逻辑地址不是被直接送到内存总线,而是送到内存管理单元(MMU)。MMU由一个或一组芯片组成,其功能就是把逻辑地址映射为物理地址,即进行地址转换。

引用来源:https://www.cnblogs.com/liuzhang/p/3729167.html
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;

浙公网安备 33010602011771号