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:

即num不会改变;p2不会改变

 

 

 

 

 

 

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.指针的指针

 

 

//待续。。。。。。

posted @ 2024-04-24 09:44  雨里青山隐  阅读(40)  评论(0编辑  收藏  举报