C语言笔记总结汇总_02_数组和指针

数组

一般我们学习只谈论C99标准下的规定,因为其他的标准支持的语法太全了

比如C11下 int arr[n]={1,2,3,4,5,6,7,8,9}这个语法是合法的,编译器很智能的将数组的个数赋值给n。。。

数组定义时可以指定大小也可以不指定大小。

int arr[10]={1,2,3,4,5,6,7,8,9,0};//sizeof(arr)=40=4byte*10个

int arr[]={1,2,3,4,5,6,7,8,9,0}; 

 

一般来说变量 i j k都是为了循环步长做的准备,len,size,n标识符都是为了数组的长度做的准备。一定要注意代码的规范性,因为我们写程序第一显示要为了给别人看我们写的代码,第二才是你写的代码要实现那些的功能。

*和指针

*的三种意义 乘法 声明 解引用

int *p=NULL;    *和变量名结合,不和类型结合。

在x86 即32位系统下 我们的指针的大小为4个字节。32bit/8=4byte

那么如果时64位的话那么就是8字节,具体来说还是要看你的IDE编译器时多少位的。

一个问题

int a  = 10;
int *p = &a;

&*p是否和&a等价;;;

*&p是否等价于&a;;;

更具运算符的优先级和结合性表得知,*和&的优先是一样的,结合方向为自右向左结合,故

&*p==》&a;

*&p==》*(p的地址)==》p==》&a;

 

数组和指针作为函数参数

void PrintArray(int arr[10],int len);

void PrintArray(int arr[5],int len);

void PrintArray(int *arr,int len);

数组名退化为指针,故上面三种都等价于第三种void PrintArray(int *arr,int len);

 

 

char *str 和  char str[]的区别

1.


void main()
{
	char *str1 = "C++";
	char str2[] = "C++";
	//str1[0] = 'c';
	str2[0] = 'c';
	return ;
}

以上代码中的str1[0]='c'编译可以通过但是执行的时候出错。该语句试图修改str1指向的字符的首个字符出现了错误。

原因在于:俩种方法对字符的数组操作的机制不同:

char *str1指向的时常量区的"C++",在常量去分配一块内存存储"C++",在栈上分配保存str1,所以修改.text区中的数据出现错误。

char str2[]表示在栈上开辟内存空间,将“C++“保存在了栈上,因此可以进行修改操作。



2.


//错误写法
char *get_str()
{
    char str[]={"1234"};
    return str;
}
//正确写法
char *get_str()
{
    char *str={"1234"};
    return str;
}

第一种因为数组定义在栈上,函数返回后栈空间被释放了。所以返回了的地址也是已经被释放的空间的地址。

第二种因为字符指针指向的是常量去的内容,是全局的,在编译的时候分配了内存在退出的程序的时候释放。所以是正确的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值