c语言指针
指针(c)
1.基本概念
1.64位操作系统中,指针占8个字节
在32位操作系统中,占4个字节
2.创建指针
int a=1;
int* p = &a;(int*是指针类型,p为指针的名称,&a是取a的地址)
*p=100;( *p此时表示取值,即*p=100 == a=100;也可以说*p==a)
————————————————————————————————————
int x;
x=10;
完整的赋值语句为:x=(int)10;
int* x;
x=(int*)10
对于*类型需要完整赋值语句
char*,int*,short*,结构体*均占四个字节
1.无论后面有几个*存储的宽度均为四个字节
char* x;
x=(char*)10;
x++;
char*去掉一个*,是char,是一个字节,因此+1
char** x;
x=(char**)10;
x++;
char**去掉一个*,是char*,是四个字节,因此10+4=14
char* x;
x=(char*)10;
x=x+5;
char*去掉一个*,是char,是一个字节,因此10+1*5=15
char** x;
x=(char**)10;
x=x+5;
char**去掉一个*,是char*,是四个字节,因此10+4*5=30
char** x;
char** y;
x=(char**)100;
y=(char**)200;
int z;
z=y-x;
char**去掉一个*,是char*,是四个字节,因此(200-100)➗4=25
2.当类型*进行运算时,去掉一个*,看他是几个字节
3.类型*可以做比较
4.两个char*相减变为int
————————————————————————————————————
3.野指针;空指针
int* p;//野指针
int* p=NULL;//空指针
4.指针常量,常量指针
指针常量(int* const p =&a;)
特点:指针的指向不可以修改,指针指向的内存的值可以修改
常量指针(const int* p=&a;)
特点: 指针的指向可以修改,但是指针指向的值不可以修改。
常量指针,首先要是常量。就是指向的值要是一个常量,但是指向的内存地址不做限制
2.函数中的使用
1.为什么使用int* x,而不是int x
eg:
打印出来为
原因:
a=x,b=y。即x=1,y=2
通过中间变量t,可以发生交换,即x=2,y=1;
执行完后会释放空间,x与y被删除(如图)
正确的:
如图
swap(int *x,int *y) //表示:int *x=&a.y同理
又因为*x=a,*y=b,所以通过中间变量可以转换。
执行完后释放内存空间(如图)
3.指针的运算
eg:
1.
int a,*p=&a,*b;(定义三个变量,a,p,b.后两个为指针,且p保存了a的地址)
b=p;(此时表示b也保存了a的地址)
2.
int x=3,*p=&x,y=0;
y=*p++; //p存储的地址值加一,即指向下一个字符(因为x是整型,占4个字节。所以地址加四)
y=(*p)++; //p指向的地址里的值加一(即x++)
3.数组的复制,s1复制到s2
代码如上图:5)先判断s1指针是否指向'/0'。否,则循环。
因此编译出来为
若要只出现hello,则要先赋值在判断
注:const表示只读不改,修饰离他最近的变量 eg:
|
4.空,野指针.申请空间(malloc)
14)(char*)malloc(32) //申请了32个字节,并且为char型
char *str= //创建了一个char型指针str,指向了申请的内存空间
当free(str)后,*str=NULL 或者str=NULL //地址为空可以不用加*
当申请内存被释放,str指向了一个被释放掉的内存,成为野指针。
因此要将他变为空指针。
5.数组与指针
1.数组名和指针
int a[5]={1,2,3,4,5};
关于数组名的解释: 当数组名作为数组定义的标识符(也就是定义或声明数组时)、sizeof 或 & 的操作数时,它才表示整个数组本身,在其他的表达式中,数组名会被转换为指向第 0 位元素(第一个元素)的指针(地址)。 注:数组名不是指针 |
int *p=&a[0] //&a[0]是第一个元素的地址.可以写成:int *p=a;
所以:*(p+1)=*(a+1)=a[i] (如图)
同时可以如图下,将*(str+1)转变为str[i]
2.数组名和指针区别
1.
第8行,注释中可以这样理解是数组名,但是数组名不是指针
图像如下图
2.数组作为参数
第13行:
sizeof(a)=40 //数组a中一个元素占4个字节,一共有10个元素,就是40个字节
sizeof(a[0])=4 //数组a中的第一个元素占四个字节(一个元素占4个字节)
相除则得到数组a中有几个元素
第6行:
sizeeof(a)=8 //此时数组名变为指针,为8个字节
sizeof(a[0])=4 //数组a中的第一个元素占四个字节(一个元素占4个字节)
相除得到2
结果
5.指针与字符串
第5行:
根据优先级,string是数组名,只是这个数组存储了两个char型指针,如图
一个指针占8个字节,两个就16个字节。
string指向的是第一个元素地址,即第一个指针的地址,即0x1000.
数组分别存储了hello中h的地址,即 0x100;和world中w的 地址0x200
第7行:
若直接printf("%s\n”,string)打印的是指针的地址,但是 %s是打印字符类型,
因此会出现乱码
而string[0]表示取值,取的就是指针所指的字符串 即 hell0;
而代码中就是I love China;
6.指针和函数
函数名是该函数所占内存的首地址
1.函数指针
1.
第10行:
(*p) 是一个指针;
(*p)() 指向的函数没有形参
viod(*p)() 没有返回值
2.
第 20行:
返回值为int型,指针q指向的函数有两个int型参数
第21行
可以写成这个,但为了打印出来加了一个printf
3.typedef
定义后可以写成下图
2.指针函数
返回值是指针的函数
3.回调函数
调用函数sort,以及函数greater
13行
第三个参数:p是一个指针,指向greater函数
6.指针与数组
1.指针数组(里面的元素是一个指针)
pa占3*8=24个字节
2.数组指针
p代表行地址,*p代表行的第一个元素的地址,**p代表第一个元素
因此p[i][j]==*(*(p+i)+j) *(p+i)第i行的第一个元素地址
*(*(p+i)+j )第i行第j个元素地址
总结:
7.指针的指针
//待续。。。。。。