接到上一篇Linux学习笔记(一)
指针:地址
1、指针变量:存地址(存地址)
定义: int a ; int *p;
说明符,说明变量p为一个指针变量
p==&a; int a=10;int *p = &a;int *q = &a;int *p = q;
只有在定义变量时候*才是说明符,其他都为运算符.
访问: Printf(“%d\n”,a); printf(“%d\n”,*p)
*指针运算符:取对应地址里面的值.
区别: a为常量(a不能自加) p 为变量(p可以自加)
2、一维数组和指针
定义: int a [10]={1,2,3,4,5,6};
数组各地址的值如图:
int *p=a;p指向a地址
访问: a[0]==*p a[3]==p[3]; *(a+5)==*(p+5)
地址取用方法替换:
int b[10] = {1,2,5,8,6,8,6,4};
int *q=b;
printf("%d\n",*(q+2));//b[2] *(b+2) p[2]
拓展:
printf(“%p\n”,a);//%p打印地址
printf(“%x\n”,a);//无符合十六进制小写字母
printf(“%X\n”,a);//无符合十六进制大写字母
printf(“%o\n”,a);//有符号八进制整数
3、Char型指针
定义:
char a; char *p=“hello”;//hello为指针/地址
char p[5]=“hello”;
char *p=“hello”;
两者区别: 前者后面没有’/0’结束,后者有’/0’
4、二维数组与指针
定义:
int a [3][4]={{1234},{1,2,3,4},{1,2,3,4}};
int *p=&a[0][2];
或int *p=a[0];
或int *p=a[1];
或int *p=a[2];
地址取用方法替换:
int a[3][4] = {{1,2,3,5},{5,6,8,7},{4,5,8,9,}};
int *p = a[0];
printf("%p\n",p+4);//a[0]+4 a+1 &p[4] &a[1][0]
printf("%d\n",*(p+2));//*(a[0]+2) p[2] a[0][2]
指针数组和数组指针
指针数组:int *a[3];
数组指针: (*p)[2]===指向整个数组的指针
函数指针数组:int (*a[3])();
Eg:
char *p[3] = {"hello","world","wyj"};//p[0]指针对应于hello,p[1]对应于world,p[3]对应于wyj
printf("%s\n",p[1]+2);//输出rld
函数
函数: 解决特定问题的方法. 形式:数据类型 函数名(参数类型列表(形参或实参))
格式:
数据类型
{
函数功能具体实现
}
printf();scanf();getchar();putchar();
举例:
#include<stdio.h>
int max(int,int); //函数的申明
int main() {
int a,b,c;
scanf("%d%d",&a,&b);
c = max(a,b); //使用函数max
printf("%d",c);
return 0;
}
//返回类型 函数名称 (参数类型 参数)
int max(int a, int b){
if(a > b){
return a;
} //函数主体
else{
return b;
}
}
- 函数原型由函数返回类型、函数名和参数表组成,它与函数定义的返回类型、函数名和参数表必须一致。函数原型必须包含参数的标识符(对函数声明而言是可选的);说明:系统标准函数并没有在包含文件中定义,而只是提供了函数原型。在调用函数时,系统会正确地调用库函数。 注意:函数原型与函数定义必须一致,否则会引起连接错误。
- 函数传参方式:函数传参就是一个值拷贝的过程
值传递:
地址传递:取*对里面的内容进行取值
代码:
//指针及地址指令:
#include<stdio.h>
int main(){
int a[3][4] = {{1,2,3,5},{5,6,8,7},{4,5,8,9,}};
int *p = a[0];
printf("%p\n",p+4);//a[0]+4 a+1 &p[4] &a[1][0]
printf("%p\n",a[1]);
printf("%p\n",a[1]+1);
printf("%d\n",p[2]);
printf("%d\n",*(p+2));//*(a[0]+2) p[2] a[0][2]
printf("%d\n",*(a[2]+1));
printf("%d\n",a[1][2]);
printf("%p\n",&a[1][0]);
printf("%p\n",*(a+1));
int b[10] = {1,2,5,8,6,8,6,4};
int *q=b;
printf("%d\n",*(q+2));//b[2] *(b+2) p[2]
char *w[3] = {"hello","world","wyj"};
printf("%s\n",w[1]+2);//=rld
return 0;
}
运行结果:
收获及感悟:
通过今天的学习进一步的巩固了有关指针的用法,以前对指针数组、数组指针和函数指针数组就非常紊乱,无法分清什么是指针数组、数组指针和函数指针数组以及如何用它们,今天的学习解决了以前的困惑;还有就是今天最大的收获是了解了更多的地址取址指令。