0
点赞
收藏
分享

微信扫一扫

0120 C指针跳转、数组名指向(笔记)

程序小小黑 2022-01-20 阅读 42
linux

目录

一、数组

二、指针

三、代码练习

三、杂谈


一、数组

1.数组内存在预处理阶段已经分配好,变量编译阶段分配不行   
    宏替换 #define MAX_SIZE 1024    int a[MAX_SIZE] 可以
    变量   int MAX_SIZE = 1024;     int a[MAX_SIZE] 不可以

2.strcpy(stu.name , "数组整体操作赋值用strcpy");
    |%-10s|id|%d|age|%d|sex|%c|\n  //数据库形式输出

3.数组首元素地址  a = &a[0]     第二个元素地址 a + 1 = &a[1]  
  数组地址       &a             超出数组空间  &a + 1

4.  printf("整个数组的大小:%d\n",sizeof(a))
    printf("a[0]的大小:%d\n",sizeof(*a))
    printf("指针的内存大小:%d\n",sizeof(a))  

 

二、指针

1.数组指针:int (*a)[10]
      
  函数指针:void (*fun) (int, int)
  指针函数:int* fun()              //函数返回指针,指针指向的不能是局部变量


2.数组和指针的联系
     1、数组名可以当成指针使用

     2、a:数组首元素的地址         a = &a[0]   a + 1 = &a[1]
                                  &a          &a + 1

     3.数组作为函数参数被传递是,数组名会被弱化为指针
        //main()        {  printf(sizeof(a)) }     输出:整个数组大小
        //func(int a[]) {  printf(sizeof(a)) }     输出:指针大小 8

     
3. 指针大小: 8字节占满计算机计算位数        
                1)32位地址总线4B  64位地址总线8B(地址总线,数据总线,控制总线) 
                2)但内存可扩充可虚拟化所以一律按8B
   

4. 内存泄漏:malloc没有free释放堆空间 new(C++) 

三、代码练习

1.两数交换
#include<stdio.h>

int main()
{
	int a = 3, b = 4;
    
    //中间变量法,空间换时间
	int temp = a;
	a = b;
	b = temp;
    printf("中间变量法:a = %d,b = %d\n",a,b);

	//数轴法/算术法,
	//加法可能上溢出
	//减法可能下溢出
	a = a + b;
	b = a - b;
	a = a - b;
	printf("加法式:a = %d,b = %d\n",a,b);

	//位操作发,不会溢出
	//异或操作
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("位操作法:a = %d,b = %d\n",a,b);

	return 0;
}

2.代码实际五大内存分配位置
//main.cpp  
int a = 0; //全局初始化区  
char *p1; //全局未初始化区  
void main()  
{  
	int b; //栈  
	char s[] = "abc";// 栈  
	char *p2;// 栈  
	char *p3 = "123456";// 123456\0在常量区,p3在栈上。  
	static int c =0; //全局(静态)初始化区  
	p1 = (char *)malloc(10);  
	p2 = (char *)malloc(20);  
	//分配得来得10和20字节的区域就在堆区。  
	strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。  
}  

3.输入10a10  输出:?
#include<stdio.h>

int main()
{
	int a = 1, b = 3;
    char c[10] = {0};
    
	scanf("%d%s%d",&a, c, &b);  //输入10a10  输出:?
	printf("%d\n", a);  //10
	printf("%d\n", b);  //未知,因为a是10  c是a10 还要再输入一个数
	printf("%s\n", c);  //a10

	return 0;
}

4.判断大小端存储
#include<stdio.h>

union demo
{
	int a;
	char ch[4];
};

int main()
{
    union demo d;
	d.a = 0x12345678;    

	int i;
	for (i = 0; i < 4; i++)
	{
		printf("%x\n",d.ch[i]);
	}

	return 0;
}

5.char c = 0 和 char c = '0' 是不一样滴
#include<stdio.h>
#include<string.h>

int main()
{
    char a[1000];
	int i;
	
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
		//printf("%4d",a[i]);
	}
	printf("%ld\n",strlen(a));  //输出255,这里0不是'0',转换为ASCII就是'\0' ,就是NULL

	return 0;
}

6.在x86系统下,其值为多少?   输出;2019  2017
#include<stdio.h>

int main()
{
    int a[4] = {2016,2017,2018,2019};
	int *ptr1 = (int *)(&a + 1);
	int *ptr2 = (int *)((int)a + 1); //windows下地址转不成数,当题看

	printf("%x, %x",ptr1[-1],*ptr2); //2019, 2017

	return 0;
}

三、杂谈

1.虚拟机回环网络解决:执行: dhclient -v

2.find结果传给wc 显示当前目录下.c文件数
  find  .  - name "*.c" | wc -l

3.小心中英文空格

4.%p地址输出符  %x转换为16进制

5.待看:makefile默认规则,git是啥
举报

相关推荐

数组名(sizeof、strlen)#c

0 条评论