内存,指针定义使用字符串相关函数数组指针
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;
}
#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语言基础之函数、虚拟键盘的使用、数组、指针、动态申请内存、内存泄漏
- 1.如何避免野指针2.获取字符串的两种方法。以及malloc,calloc,ralloc的使用注意点3.二维三维数组4.数组和函数的区别
- Delphi 字符、字符串、字符数组和字符指针及其相关函数
- C语言学习6 :指针的定义,指针类型要合法,指针要初始化,指针做函数参数,数组和指针的通用性,指针+1所代表的空间,void * 指针,交换函数中的指针,数组和字符型指针区别,字符型指针的应用,使用指针完成字符操作函数
- C语言03 - 函数指针、内存分配、字符串使用
- 函数指针与函数指针数组的定义与使用
- 【C/C++语言基础学习】在主函数的定义的指针数组、二维数组通过三级指针在被调用函数分配内存
- C语言基础之函数、虚拟键盘的使用、数组、指针、动态申请内存、内存泄漏
- 函数指针与函数指针数组的定义与使用
- 函数指针与函数指针数组的定义与使用
- 约瑟夫环问题的 PHP 实现--使用 PHP 数组内部指针操作函数
- 定义struct/struct定义在哪里/函数返回指针类型/指针数组与数组指针/{}里是局部定义/fabs、abs
- C语言字符串以及相关指针的使用
- 字符串以及内存操作相关函数
- 外部定义了一个数组,在函数内用指针对其操作
- 鸡啄米:C++编程入门系列之二十七(数组、指针和字符串:指针变量的声明、地址相关运算--“*”和“&”)
- 一劳永逸:关于C/C++中指针、数组与函数复合定义形式的直观解释
- Delphi 的内存操作函数(2): 给数组指针分配内存
- 使用指针做函数返回值和指针(栈内存与堆内存的函数形式使用)
- 指针数组作为函数参数的使用问题