指针补充+结构体

#include <stdio.h>
int main()
{
  int arr[] = {1,2,3,4,5};
  short *p = (short*)arr;
  int i = 0;
  for(i=0; i<4; i++)
  {
    *(p+i) = 0;
  }
   
  for(i=0; i<5; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

由于p为short* 类型的指针,所以每次只能访问两个字节的权限,所以只能更改两个字节 0 0 3 4 5
arr数组在内存中的存储格式为:

0x00ECFBF4:  01 00 00 00
0x00ECFBF8:  02 00 00 00
0x00ECFBFC:  03 00 00 00
0x00ECFC00:  04 00 00 00
0x00ECFC04:  05 00 00 00

指针p的类型为short*类型的,因此p每次只能所有两个字节,for循环对数组中内容进行修改时,一次访问的是:
arr[0]的低两个字节,arr[0]的高两个字节,arr[1]的低两个字节,arr[1]的高两个字节,故改变之后,数组中内容如下:

0x00ECFBF4:  00 00 00 00
0x00ECFBF8:  00 00 00 00
0x00ECFBFC:  03 00 00 00
0x00ECFC00:  04 00 00 00
0x00ECFC04:  05 00 00 00

故最后打印:0 0 3 4 5
2.

int a = 0x11223344;

其在内存中的存储
假设,a变量的地址为0x64,则a变量在内存中的模型为:

0x64| 44 |
0x65| 33 |
0x66| 22 |
0x67| 11 |

char类型的指针变量pc指向只能指向字符类型的空间,如果是非char类型的空间,必须要将该空间的地址强转为char类型。
char pc = (char)&a; pc实际指向的是整形变量a的空间,即pc的内容为0x64,即44,
*pc=0,即将44位置中内容改为0,修改完成之后,a中内容为:0x11223300
3.指针-指针(地址-地址)
首先,两个指针指向同一块空间(指针的类型要是一致的) 得到的是两个指针之间元素的个数
4.允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但不允许与指向第一个元素之前的那个内存位置的指针进行比较
5.指针是指针,不是数组;数组就是数组,不是指针
指针就是用来存放地址的,地址的存放需要多少空间,指针变量的大小就是多少
6.二级指针
int a=10;
int p=&a;
int
*pp=&p;
int 代表p是指向int型的指针,p中存放的是a的地址对p解引用可以得到a
int
代表pp是指向int 型的指针,pp中存放的是p的地址,对pp解引用可以得到p,即对pp解引用可以得到a的地址,*p可以得到a
7.指针数组,顾名思义,是用来存放指针的数组
int
arr[]={&a,&b,&c};这里的arr就是用来存放指针的数组
用指针数组来模拟二维数组

int a1={2,3,4,5,6};
int a2={3,4,5,6,7};
int a3={4,5,6,7,8};
int* p={a1,a2,a3};
for(int i=0;i<3;i++){
for(j=0;j<5;j++){
printf("%d ",p[i][j];
}
printf("\n");
}

8.arr[i[完全等价于*(arr+i)等价于*(i+arr)等价于i[arr]
i[arr]-(i+arr)
arr[i]-
(arr+i)

arr[i][j]等价于(*(arr+i)+j)等价于 * (arr+i)[j]

struct Book{
char name[20];
int price;
}b3,b4,b5;

int main(){struct Book b1,b2;}
//b1,b2与b3,b4,b5的差别在于b3,4,5为全局变量而1,2为局部变量
在c语言中,struct是不能省略的,如果想要省略,可以采用typedef 的方式

typedef struct Book{
char name[20];
int price;
}Book;

之后就可以直接使用Book来命名新的结构体变量了
10.结构变量的成员是通过点操作符来访问的, .操作符接受两个数,左边为结构体变量,右边为结构体成员
结构体传参时
void print1(struct s s1){
printf(“%d”,s1.num);
}
void print2(struct s*//这里的struct s*可以代表指针指向的为struct s类型的结构体变量ps){
printf(“%d”,s1->num);
}
结构体传参和结构体地址传参,尽量选择结构体地址传参
函数传参时需要压栈,如果传递一个结构体对象时,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值