数组 指针

数组:一组数据类型相同的数据 int a[常量]
1.数组中所有的数据都是相同的数据类型
2.数组中的元素的首地址都是连续的
赋初值的方式:在定义时赋值
循环赋值

数组与指针的联系:1.数组的名字可以当成指针去使用
a:数组首元素的地址 a=&a[0] a+1=&a[1]

其中ptr1指向a后面的地址就是2019后面的地址
ptr2指向a中2016的地址+1

1 1 2 3 5 8 13

sizeof计算数组大小

数组作为函数参数被传递:数组名会被弱化为指针(8个字节)

二维数组
杨辉三角:
#include<stdio.h>
int main()
{
int n,i,j;
int a[10][10]={0};
scanf("%d",&n);
for(i=0;i<n;i++)
{
a[i][0]=1;
a[i][i]=1;
for(j=1;j<=i;j++)
a[i+1][j]=a[i][j]+a[i][j-1];
for(j=0;j<n-i;j++)
printf(" “);
for(j=0;j<=i;j++)
printf(”%d “,a[i][j]);
printf(”\n");
}
return 0;
}
字符数组;大小要加1(字符最后要加\0)
常用头文件:#include<string.h> //strlen 计算字符串大小 strcat连接两个字符串 strcmp 比较两个字符串:如果第一个大返回正数;相等返回0;小于返回负数,逐一比较每个字母的ascall值

#include<stdio.h>
#include<string.h>

int mylen(char str) //strlen 计算长度
{
int count =0;
char
tmp =str;
if(NULL ==str)
{
return 0;
}
while(*tmp !=’\0’)
{
count++;
tmp++;
}
return count;
}
void mycpy(char *str1,char *str2) //strcpy 粘贴
if(NULL ==str1 || NULL ==str2)
{
return;
}
else
{
int len =mylen(str2);
int i;
for(i = 0;i < len;i++)
{
(str1+i)=(str2+i);
}
*(str1+len)=’\0’;
}
}

void mycat(char *srt1,char str2) // strcat连接两个字符串
{
if(NULL ==str2 || NULL ==srt1)
{
return;
}
else
{
int len =mylen(str2);
int i;
while(
(srt1+i)!=’\0’)
{
i++;
}
int j;
for(j = 0;j < len;j++)
{
(srt1+i+j)=(str2+j);
}
*(srt1+i+len)=’\0’;
}
}
int main()
{
char str1[20] = “hello”;
char str2[20] =“word”;
mycat(str1,str2);
printf("%s\n",str1);
return 0;
}
exchange 逆序
#include<stdio.h>
#include<string.h>

void exchange(char *str,int len)
{
int i;
char temp;
for(i=0;i<len/2;i++)
{
temp = *(str+i);
(str+i)=(str+len-1-i);
*(str+len-1-i)=temp;
}
}
void exchange2(char str)
{
int i;
int len=0;
int start=0;
char temp=str;
for(i=0;i<strlen(str);i++)
if(
(temp+i) !=’ '&&
(temp+i) !=’\0’)
{
len++;
}
else
{
exchange(str+start ,len);
start=start+len+1;
len=0;
}
}
int main()
{
char str[20] = “I am from china”;
exchange(str,strlen(str));
exchange2(str);
printf("%s\n",str);
return 0;
}
指针数组:int *a[10] a[1]指向的内存地址是连续的;每个指针的地址也是连续的
数组指针:int (a)[10]#include<stdio.h>
int main()
{
char s[10];
s[0]=“suqian”;
s[1]=“jiaoyu”;
printf("%c\n",s[0]); //s[0]首字母的首地址
printf("%c\n",
(s[0]+1)); //指向的内存地址是连续的所以指向s后面的u
printf("%c\n",s[0]+1); //指向s 的Ascall码值加1
printf("%c\n",
(s[0]+6)); // s[0]为 suqian\0为6为7位所以他指向\0
printf("%c\n",
(s[0]+7)); //每个指针的地址也是连续的
printf("%c\n",**(&s[0]+1));//&s[0]指的是s[0]的首地址;+1指s[1]的首地址;第一个
指s[1]的内容; 第二个是指s[1]首字母的首地址
}
&a[0]+1=
[*a[0+1]
函数指针:void(fun)(int )
指针函数:int
fun()指针指向的不能是局部变量
#include<stdio.h>
int (*fun)(int,int);
int add(int a,int b)
{
return a+b;
}
int sub(int a,int b)
{
return a-b;
}
int main()
{
int a,b;
char c;
scanf("%d %c %d",&a,&c,&b);
if(c==’+’)
{
fun =add;
}
if(c==’-’)
{
fun = sub;
}
printf("%d\n",(*fun)(a,b));
return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值