您的位置:首页 > 编程语言 > C语言/C++

内存,指针定义使用字符串相关函数数组指针

2017-07-17 09:04 531 查看
查看内存

#include <stdio.h>

int main()

{
int a; // 整型变量 占4个字节

// & 运算用来获取后面变量的地址
// 我们一般说变量的地址,说的都是变量的首地址
// %p 按十六进制方式打印地址
printf ("%p\n", &a);
printf ("%d\n", &a);

printf ("%#x\n", &a);
printf ("%#X\n", &a);

return 0;

}

指针定义、使用

#include <stdio.h>

// 指针变量的定义

int main1()

{
int a;

// 定义一个指针变量,
// *表示这个变量是指针,内部必须要存地址
// int 这个指针指向的类型是 int 类型数据
int *p;
p = &a;

printf ("&a = %p\n", &a);
printf ("p  = %p\n", p);
printf ("&p = %p\n", &p);

return 0;

}

// 指针变量的大小

int main2()

{

int a;
int *p = &a;

char ch;
char *pch = &ch;

// 指针内部存的是地址,32位情况下,地址都是32位的
// 所以在32位编译器下,指针都是4个字节
printf ("p   = %d\n", sizeof(p));
printf ("pch = %d\n", sizeof(pch));

return 0;

}

// 指针变量的取值

int main3()

{
int a = 10;

int *p = &a;

printf ("a = %d\n", a);

// 在变量定义的时候,*代表变量的类型是指针
// 在使用指针变量的时候,*代表去指针指向的那一块内存的值
// * + 地址, 代表那个那个地址所表示的内存
printf ("*p = %d\n", *p);

*p = 200;

printf ("a = %d\n", a);

return 0;

}

int main()

{
int a = 10;
int b = 20;

int *pa = &a;
int *pb = &b;

// 通过 pa 与 pb 交换 a 与 b 的值
int tmp = *pa;
*pa = *pb;
*pb = tmp;

return 0;

}

// * &

int main()

{
int a = 10;

int *p = &a;

// *&a ==> *(&a) ==> *p ==> a
// &*p ==> &(*p) ==> &a ==> p

return 0;

}

指针变量的运算

#include <stdio.h>

// 关于指针类型的加减:

// pa + n = pa + sizeof(指针所指向的类型)*n

int main()

{
int a;    int *pa = &a;
char ch;  char *pch = &ch;
double d; double *pd = &d;

printf ("pch =  %p\n", pch);
getchar();
pch++;
printf ("pch =  %p\n", pch);

printf ("pa =  %p\n", pa);
getchar();
pa++;
printf ("pa =  %p\n", pa);

printf ("pd =  %p\n", pd);
getchar();
pd++;
printf ("pd =  %p\n", pd);

return 0;

}

数组指针

#include <stdio.h>

// 关于 a &a[0] &a

int main1()

{
int a[5];

// 数组名代表数组首个元素的地址 等价于 &a[0]
printf ("a       = %p\n", a);
printf ("a+1     = %p\n\n", a+1);

printf ("&a[0]   = %p\n", &a[0]);
printf ("&a[0]+1 = %p\n\n", &a[0]+1);

// &a  是数组的地址,和数组首个元素的地址区分开
printf ("&a      = %p\n", &a);
printf ("&a+1    = %p\n", &a+1);

return 0;

}

// 数组指针:一个指针指向数组

int main2()

{
int a[5] = {1,2,3,4,5};

int *p = &a[1];
printf ("%d\n", *(p-1));
printf ("%d\n", *p);
printf ("%d\n", *(p+1));
printf ("%d\n", *(p+2));
printf ("%d\n", *(p+3));

return 0;

}

// 数组名代表数组首个元素的地址,在某些场合

// 可以当指针使用

int main3()

{
int a[5] = {1,2,3,4,5};
printf ("%d\n", *a);
printf ("%d\n", *(a+1));
printf ("%d\n", *(a+2));
printf ("%d\n", *(a+3));

return 0;

}

int main4()

{
int a[5] = {1,2,3,4,5};
int *p = a;
int i;
for (i = 0; i < 5; i++)
{
printf ("%4d", *(p+i));
}
printf ("\n");
// *(p+i) == *(a+i) == a[i] == p[i]
for (i = 0; i < 5; i++)
{
printf ("%4d", p[i]);
}
printf ("\n");

return 0;

}

// 数组指针与数组的差异1:数组指针不能代替数组名求数组长度

int main5()

{
int a[5];
int *p = a;

printf ("%d\n",sizeof(a));
printf ("%d\n",sizeof(p));

return 0;

}

// 数组指针与数组的差异2:数组是一个常量,不能改变

int main()

{
int a[5] = {1,2,3,4,5};
int *p = a;

int i;
for (i = 0; i < 5; i++)
{
printf ("%d\n", *(p++));
}

for (i = 0; i < 5; i++)
{
printf ("%d\n", *(a++));
}

return 0;

}

指针方式逆序数组

#include <stdio.h>

int main()

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

int *p1 = a;     // 指向数组的第一个元素
int *p2 = a + sizeof(a)/sizeof(a[0]) - 1;

while (p1 < p2)
{
int tmp = *p1;
*(p1++) = *p2;
*(p2--) = tmp;
}

int i;
for (i = 0; i < 10; i++)
{
printf ("%4d", a[i]);
}

printf ("\n");

return 0;

}

字符串指针

#include <stdio.h>

#include <string.h>

int main1()

{
char ch[] = "hello";
char *pch = ch;

printf ("%s\n",pch);
int i;
for (i = 0; i < strlen(ch); i++)
{
printf ("%c", *(pch+i));
}
putchar ('\n');

puts(pch);

char str[10];
char *pstr = str;

scanf ("%s", pstr);

puts(str);

return 0;

}

// 典型错误1:将一个字符串写入到一个没有初始化的指针位置

int main2()

{
//char str[10];
//char *p = str;
char *p;  // 野指针
printf ("p = %p\n", p);
scanf ("%s", p);

return 0;

}

// 字符串:"hello"  字符串代表字符串的首个元素的地址

int main3()

{
// "hello"代表这个字符串首地址,可以用char *类型的指针指向它
char *p = "hello";

int i;
for (i = 0; i< strlen(p); i++)
{
printf ("%c", *(p+i));
}
putchar('\n');
return 0;

}

// 典型错误2:用指针去修改字符串常量的值

int main4()

{
// 字符串: "hello" 是一个常量,不能用指针改变它的值
// 只能拿来使用
char *p = "wello";
*p = 'h';

printf ("%s\n",p);

return 0;

}

// 比较字符串与字符数组的区别

int main()

{
// 字符串: "hello" 是一个常量,不能用指针改变它的值
// 只能拿来使用
char str[] = "wello";
char *p = str;
*p = 'h';

printf ("%s\n",p);

return 0;

}

逆序上海

#include <stdio.h>

#include <string.h>

int main()

{
// char *p = "I am from shanghai";
// char str[] = "I am from shanghai";
char str[] = "you are from shanghai";

// 将整个字符串逆序
char *p1 = str;
char *p2 = str + strlen(str) - 1;
char *p3 = NULL;  // 用于将单词逆序
char tmp;
while (p1 < p2)
{
tmp = *p1;
*(p1++) = *p2;
*(p2--) = tmp;
}
puts(str);

// 再将每一个单词进行逆序,单词通过空格去找
p1 = str;
p2 = str;

while(*p2) // p2找到字符串结束为止
{
if (*p2 == ' ') // 找到一个单词,要将前面的单词进行逆序
{
p3 = p2 - 1;
while (p1 < p3)
{
tmp = *p1;
*(p1++) = *p3;
*(p3--) = tmp;
}
p1 = p2 + 1;
}
p2++;
}

p3 = p2 - 1;
while (p1 < p3)
{
tmp = *p1;
*(p1++) = *p3;
*(p3--) = tmp;
}

puts(str);

return 0;

}

多级指针

#include <stdio.h>

int main()

{
int a = 10;
int *p     = &a;
int **pp   = &p;
int ***ppp = &pp;

printf ("%d, %d, %d, %d\n", a, *p, **pp, ***ppp);

return 0;

}

二维数组与指针

#include <stdio.h>

int main()

{
int a[3][5];

int (*p)[5] = a;

// p+1 与 p 进行比较

return 0;

}

字符串相关韩束

#include <stdio.h>

#include <string.h>

// 字符串追加

int main1()

{
char str1[100] = "hello ";
char str2[]  = "world";

// 把字符出str2的内容 放到字符串str1的末尾
// 注意:str1空间必须足够大,否则就会越界
strcat(str1, str2);

// 只将str2的前两个字符放到str1的后面
strncat(str1, str2, 2);

puts(str1);

return 0;

}

// 字符串的判断

int main2()

{
//char str1[] = "hello ";
//char str1[] = "world";
char str1[] = "workasjdksahdksahd";
char str2[] = "world";

// 用于比较两个字符串的大小
// 如果两个字符串相等,这个值为0
if(strcmp(str1, str2) == 0)
{
printf ("str1 == str2\n");
}
else
{
printf ("str1 != str2\n");
}

if(strncmp(str1, str2, 3) == 0)
{
printf ("str1 == str2\n");
}
else
{
printf ("str1 != str2\n");
}

return 0;

}

// 字符串的拷贝

int main3()

{
char str1[100] = "hello ";
char str2[] = "wor";

// str1 = str2  字符数组不能直接赋值
// 用str2的值替换str1
// 注意:str1要足够大,不然会越界
//strcpy(str1, str2);

// 用str2的前两个字符替换str1
strncpy(str1, str2, 2);
puts(str1);

return 0;

}

int main4()

{
char str[100];
// str = "hello"; 不可以对字符数组直接赋值

    strcpy(str, "hello");
puts(str);

return 0;

}

// 字符串拷贝

int main()

{
char str1[100] = "hello";
char str2[] = "worldkgffijhgkjhgkjh";

// 拷贝实现
char *p1 = str1;
char *p2 = str2;

while (*p2)
{
*(p1++) = *(p2++);
}
*p1 = '\0';

puts(str1);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存 指针 c语言
相关文章推荐